1 はじめての e-Stat with API

はじめて、R の etatapi を使って、e-Stat のデータを取得する方法を簡単に説明します。

初期設定

パッケージの、estatapi が、e-Stat のデータを取得するためのものです。tidyverse は基本的な解析をおこなうため、showtextshowtext_auto() は、グラフなどに、日本語が含まれる場合の文字化けを防ぐためのものです。

インストールされていないパッケージがありましたら、上のメニューの Tools > Install Packages から、インストールしてください。

library(tidyverse)
library(showtext)
library(estatapi)
showtext_auto()

1.1 e-Stat 登録と、アプリケーションIDの取得

e-Stat API を利用するには、appId が必要です。

  1. e-stat: https://www.e-stat.go.jp/ のページへ行く。
  2. 右上の新規登録から、アカウント登録をします。
    • メールアドレスを入力し、そこに届いてリンクを開き、パスワードを設定。
    • パスワード設定は、Google などのアカウント連携ですることも可能です。
  3. アカウントにログイン。上の帯に、メールアドレスが表示されます。
  4. その右のマイページに行き、API機能(アプリケーションID発行)へ。まず、必要事項の入力が必要ですが、説明をみてください。
    • 名称:API機能を利用するアプリケーション名(システム名等)- R または、RStudio
    • URL:アプリケーションのURL(トップページ等のURL)
  • If you do not use it on the public site, please enter “http: // test.localhost /” etc. - localhost でよいでしょう。
    • 概要:アプリケーション(システム)の概要 - estatapi とでも書いておけば良いでしょう。
    • 右の発行を押すと、appId が表示されます。これを記録。

1.2 最初の例

appId <- " " # 私のものは、英数40文字

以下の形式でデータを取得する。appID は上で指定したもの。appId の場所を、実際のもので置き換えても良いが、人に見せるものではないので、appId として、置き換えておくのがよいだろう。

必要なのは、statsDataId で、すべてのデータにこの ID が振られているわけではない。データをしらべて、API の表示があるものは、それを開くと、途中に、

statsDataId=0003009189

などの部分があるので、この10桁の番号をコピーして貼り付ける。8桁の「政府統計コード」ではないので、混乱しないこと。

statsDataId 取得については、最後の「参考」に少し書いてあります。

ダウンロードしたデータをあとで使うために名前を設定する。

data0 <- estat_getStatsData(appId, statsDataId = "1234567890"
)
data0

メタ・データは、同じように、estat_getMetaInfo で得られる。

data0m <- estat_getMetaInfo(appId, statsDataId = "1234567890")
data0m

1.2.1 例1 社会・人口統計体系

社会・人口統計体系 / 都道府県データ / 基礎データ

df1 <- estat_getStatsData(appId,statsDataId = "0000010103")
Fetching record 1-100000... (total: 319920 records)

Fetching record 100001-200000... (total: 319920 records)

Fetching record 200001-300000... (total: 319920 records)

Fetching record 300001-319920... (total: 319920 records)
df1
glimpse(df1)
Rows: 319,920
Columns: 11
$ tab_code       <chr> "00001", "00001", "00001", "00001", "00001…
$ 観測値         <chr> "観測値", "観測値", "観測値", "観測値", "…
$ cat01_code     <chr> "C1101", "C1101", "C1101", "C1101", "C1101…
$ `C 経済基盤` <chr> "C1101_県内総生産額(平成17年基準)", "C11…
$ area_code      <chr> "00000", "00000", "00000", "00000", "00000…
$ 地域           <chr> "全国", "全国", "全国", "全国", "全国", "…
$ time_code      <chr> "2001100000", "2002100000", "2003100000", …
$ 調査年         <chr> "2001年度", "2002年度", "2003年度", "2004…
$ unit           <chr> "百万円", "百万円", "百万円", "百万円", "…
$ value          <dbl> 520999398, 516047976, 516778382, 523329043…
$ annotation     <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA…
df1m <- estat_getMetaInfo(appId, statsDataId = "0000010103")
glimpse(df1m)
List of 5
 $ tab   : tibble [1 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr "00001"
  ..$ @name : chr "観測値"
  ..$ @level: chr "1"
 $ cat01 : tibble [502 × 4] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:502] "C1101" "C1102" "C110201" "C110202" ...
  ..$ @name : chr [1:502] "C1101_県内総生産額(平成17年基準)" "C1102_県内総生産額(産業)(平成17年基準)" "C110201_県内総生産額(農林水産業)(平成17年基準)" "C110202_県内総生産額(農業)(平成17年基準)" ...
  ..$ @level: chr [1:502] "1" "1" "1" "1" ...
  ..$ @unit : chr [1:502] "百万円" "百万円" "百万円" "百万円" ...
 $ area  : tibble [48 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:48] "00000" "01000" "02000" "03000" ...
  ..$ @name : chr [1:48] "全国" "北海道" "青森県" "岩手県" ...
  ..$ @level: chr [1:48] "1" "2" "2" "2" ...
 $ time  : tibble [47 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:47] "1975100000" "1976100000" "1977100000" "1978100000" ...
  ..$ @name : chr [1:47] "1975年度" "1976年度" "1977年度" "1978年度" ...
  ..$ @level: chr [1:47] "1" "1" "1" "1" ...
 $ .names: tibble [4 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ id  : chr [1:4] "tab" "cat01" "area" "time"
  ..$ name: chr [1:4] "観測値" "C 経済基盤" "地域" "調査年"
df1m$tab

コード(cat01_code)によって、各データが分類されている。

df1m$cat01
df1m$area
df1m$time
df1m$.names
df1 %>% filter(cat01_code %in% c('C1101', 'C1102')) %>%
  filter(地域 == "全国") %>%
  ggplot(aes(調査年, value, color = cat01_code)) + geom_point()

調査年が文字データなので、数値の連続データとして、折れ線グラフには描けません。一旦、数値データにして、それから、ラベルだけ書き換える必要があります。まず、数値データにするため、調査年の最初の四つの数字を取り出します。

df1 %>% filter(cat01_code %in% c('C1101', 'C1102')) %>%
  filter(地域 == "全国") %>% mutate(year = as.numeric(stringr::str_sub(調査年, 1L, 4L))) %>%
  select(cat01_code, year, value)
df1 %>% filter(cat01_code %in% c('C1101', 'C1102')) %>%
  filter(地域 == "全国") %>% mutate(year = as.numeric(stringr::str_sub(調査年, 1L, 4L))) %>% 
  ggplot(aes(year, value, color = cat01_code)) + geom_line() +
  labs(title = "C1101_県内総生産額(平成17年基準), C1102_県内総生産額(産業)(平成17年基準)", x = "", y = "", color = "") + scale_x_continuous(breaks = seq(1975,2021,2), labels = paste0(seq(1975,2021,2),"年度"))

1.2.2 例2 年齢別人口

df2 <- estat_getStatsData(appId, statsDataId = "0003448228")
Fetching record 1-2244... (total: 2244 records)
df2
df2m <- estat_getMetaInfo(appId, statsDataId = "0003448228")
glimpse(df2m)
List of 6
 $ cat01 : tibble [4 × 4] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:4] "001" "002" "003" "004"
  ..$ @name : chr [1:4] "男女計" "男" "女" "人口性比"
  ..$ @level: chr [1:4] "1" "1" "1" "1"
  ..$ @unit : chr [1:4] "千人" "千人" "千人" "女性=100"
 $ cat02 : tibble [2 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:2] "001" "002"
  ..$ @name : chr [1:2] "総人口" "日本人人口"
  ..$ @level: chr [1:2] "1" "1"
 $ cat03 : tibble [102 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:102] "01000" "01001" "01002" "01003" ...
  ..$ @name : chr [1:102] "総数" "0歳" "1歳" "2歳" ...
  ..$ @level: chr [1:102] "1" "1" "1" "1" ...
 $ area  : tibble [1 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr "00000"
  ..$ @name : chr "全国"
  ..$ @level: chr "1"
 $ time  : tibble [3 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:3] "1601" "1301" "1701"
  ..$ @name : chr [1:3] "2020年10月1日現在" "2021年10月1日現在" "2022年10月1日現在"
  ..$ @level: chr [1:3] "1" "1" "1"
 $ .names: tibble [5 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ id  : chr [1:5] "cat01" "cat02" "cat03" "area" ...
  ..$ name: chr [1:5] "男女別・性比" "人口" "年齢各歳" "全国" ...

1.2.3 人口:就業状態

df3 <- estat_getStatsData(appId, statsDataId = "0003009189")
Fetching record 1-360... (total: 360 records)
df3
df3m <- estat_getMetaInfo(appId, statsDataId = "0003009189")
glimpse(df3m)
List of 7
 $ tab   : tibble [1 × 4] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr "01"
  ..$ @name : chr "実数(人口)"
  ..$ @level: chr ""
  ..$ @unit : chr "万人"
 $ cat01 : tibble [1 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr "000"
  ..$ @name : chr "全産業"
  ..$ @level: chr "1"
 $ cat02 : tibble [5 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:5] "00" "01" "02" "08" ...
  ..$ @name : chr [1:5] "15歳以上人口" "労働力人口" "就業者" "完全失業者" ...
  ..$ @level: chr [1:5] "1" "1" "1" "1" ...
 $ cat03 : tibble [3 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:3] "0" "1" "2"
  ..$ @name : chr [1:3] "総数" "男" "女"
  ..$ @level: chr [1:3] "1" "1" "1"
 $ area  : tibble [1 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr "00000"
  ..$ @name : chr "全国"
  ..$ @level: chr "1"
 $ time  : tibble [24 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:24] "1999100000" "2000100000" "2001100000" "2002100000" ...
  ..$ @name : chr [1:24] "1999年度" "2000年度" "2001年度" "2002年度" ...
  ..$ @level: chr [1:24] "1" "1" "1" "1" ...
 $ .names: tibble [6 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ id  : chr [1:6] "tab" "cat01" "cat02" "cat03" ...
  ..$ name: chr [1:6] "表章項目" "産業" "就業状態" "性別" ...
df3m$cat02

1.2.4 Population in English

df3e <- estat_getStatsData(appId, statsDataId = "0003445078", lang = "E")
Fetching record 1-12258... (total: 12258 records)
df3e

1.3 Using URL

API URL の構造を理解する。

Rからe-Stat APIを使う: https://qiita.com/nozma/items/f88f5cc60ab63461deae

library(httr)
# アプリケーション ID を指定します。
appid <- appId # "あなたのアプリケーション ID"

# 統計表 ID を指定します。
statsDataId <- "0003445078"

# データを取得します。
response <- GET(url = "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData",
                 query = list(appId = appid,
                              statsDataId = statsDataId,
                              metaGetFlg = "Y",
                              cntGetFlg = "N",
                              explanationGetFlg = "Y",
                              annotationGetFlg = "Y",
                              sectionHeaderFlg = "1",
                              replaceSpChars = "0"))
glimpse(response)
List of 10
 $ url        : chr "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData?appId=3b6fdab24adcaa824f5a62db1b6858e14f6896a8&statsDat"| __truncated__
 $ status_code: int 200
 $ headers    :List of 15
  ..$ content-type             : chr "text/plain; charset=utf-8"
  ..$ transfer-encoding        : chr "chunked"
  ..$ connection               : chr "keep-alive"
  ..$ x-frame-options          : chr "SAMEORIGIN"
  ..$ date                     : chr "Sun, 28 May 2023 12:29:11 GMT"
  ..$ x-xss-protection         : chr "1; mode=block"
  ..$ content-encoding         : chr "gzip"
  ..$ x-zen-fury               : chr "5b53d3dda716a328fa70bbc32f004b4e9410d112"
  ..$ vary                     : chr "Accept-Encoding"
  ..$ x-content-type-options   : chr "nosniff"
  ..$ x-cache-status           : chr "NOTCACHED"
  ..$ cache-control            : chr "no-store"
  ..$ server                   : chr "ZENEDGE"
  ..$ strict-transport-security: chr "max-age=0"
  ..$ x-cdn                    : chr "Served-By-Zenedge"
  ..- attr(*, "class")= chr [1:2] "insensitive" "list"
 $ all_headers:List of 1
  ..$ :List of 3
  .. ..$ status : int 200
  .. ..$ version: chr "HTTP/1.1"
  .. ..$ headers:List of 15
  .. .. ..- attr(*, "class")= chr [1:2] "insensitive" "list"
 $ cookies    :'data.frame':    2 obs. of  7 variables:
  ..$ domain    : chr [1:2] "#HttpOnly_api.e-stat.go.jp" "api.e-stat.go.jp"
  ..$ flag      : logi [1:2] FALSE FALSE
  ..$ path      : chr [1:2] "/" "/"
  ..$ secure    : logi [1:2] FALSE FALSE
  ..$ expiration: POSIXct[1:2], format: "Inf" ...
  ..$ name      : chr [1:2] "X-Oracle-BMC-LBS-Route" "TS0187ce26"
  ..$ value     : chr [1:2] "01fb9bad51d8aed258491a35c882b4b7d25b695d" "01c3c9b3a91d864367e153bdfeccc46c46ac2c307f56c254a7f34a948cfe2b6421d6a0a2d84780be9755427bd031cee451c862208bfa203"| __truncated__
 $ content    : raw [1:1186538] 22 52 45 53 ...
 $ date       : POSIXct[1:1], format: "2023-05-28 12:29:11"
 $ times      : Named num [1:6] 0 0.00002 0 0.000071 0.76822 ...
  ..- attr(*, "names")= chr [1:6] "redirect" "namelookup" "connect" "pretransfer" ...
 $ request    :List of 7
  ..$ method    : chr "GET"
  ..$ url       : chr "http://api.e-stat.go.jp/rest/3.0/app/getSimpleStatsData?appId=3b6fdab24adcaa824f5a62db1b6858e14f6896a8&statsDat"| __truncated__
  ..$ headers   : Named chr "application/json, text/xml, application/xml, */*"
  .. ..- attr(*, "names")= chr "Accept"
  ..$ fields    : NULL
  ..$ options   :List of 2
  .. ..$ useragent: chr "libcurl/7.88.1 r-curl/5.0.0 httr/1.4.6"
  .. ..$ httpget  : logi TRUE
  ..$ auth_token: NULL
  ..$ output    : list()
  .. ..- attr(*, "class")= chr [1:2] "write_memory" "write_function"
  ..- attr(*, "class")= chr "request"
 $ handle     :Class 'curl_handle' <externalptr> 
 - attr(*, "class")= chr "response"

2 estatapi

2.1 基本事項

GitHubPages の内容をまずは、確認します。

2.1.1 統計表情報取得(estat_getStatsList()

appId <- " " # 私のものは、英数
estat_getStatsList(appId = appId, searchWord = "チョコレート")

ここで、STAT_NAMEやGOV_ORGは人間が読みやすい形式のラベルになっていますが、 プログラム中で扱う場合はコードのままの方が都合がいいこともあります。そのときは.use_label = FALSEを指定してください。

estat_getStatsList(appId = appId, 
                   searchWord = "チョコレート", 
                   .use_label = FALSE)

2.1.2 メタ情報取得(estat_getMetaInfo()

統計データのメタ情報を取得します。この関数は、結果をlistとして返します。listの各要素が、それぞれのデータ項目についてのメタ情報を含んだtbl_dfになっています。

例えば、0003103532というIDの統計に関するメタ情報を取得するには、statsDataIdという引数にIDを指定して、以下のようにします。

meta_info <- estat_getMetaInfo(appId = appId, statsDataId = "0003103532")
names(meta_info)
[1] "tab"    "cat01"  "cat02"  "area"   "time"   ".names"
meta_info$cat01

2.1.3 統計データ取得(estat_getStatsData()

estat_getStatsData(
  appId = appId,
  statsDataId = "0003103532",
  cdCat01 = c("010800130","010800140")
)
Fetching record 1-17792... (total: 17792 records)

limitで取得する最大のレコード数を、startPositionで取得を始めるレコードの位置を指定することもできます。とりあえず少しだけ抜き出して見たい場合や、少しずつデータを取ってきたい場合にはこれらのパラメータが便利です。

estat_getStatsData(
  appId = appId, statsDataId = "0003103532", cdCat01 = c("010800130","010800140"),
  limit = 3
)
Fetching record 1-3... (total: 17792 records)
estat_getStatsData(
  appId = appId, statsDataId = "0003103532", cdCat01 = c("010800130","010800140"),
  startPosition = 101,
  limit = 3
)
Fetching record 101-103... (total: 17792 records)

2.1.4 データカタログ情報取得(estat_getDataCatalog()

統計表ファイル(Excel、CSV、PDF)および統計データベースの情報を取得できます。

このAPIはファイルのURLを返すだけなので、そのままRで処理することは難しいかもしれません。

catalog1 <- estat_getDataCatalog(appId = appId, searchWord = "チョコレート", dataType = c("PDF", "XLS"))
catalog1[1, c("@id", "STAT_NAME", "TABLE_NAME", "SURVEY_DATE", "TABLE_SUB_CATEGORY1", "DATASET_NAME", "NAME", "LANDING_PAGE", "URL", "FORMAT")] %>%
  glimpse

2.2 estatapiパッケージで簡単にe-Statのデータ取得

2016.5.27 更新の記事:https://qiita.com/kazutan/items/9c0b2dd0f055fde45cda

social_life_stat <- estat_getStatsList(appId = appId, searchWord = "社会生活基本調査")
glimpse(social_life_stat)
Rows: 11,184
Columns: 22
$ `@id`                    <chr> "0003005834", "0003005836", "000…
$ STAT_NAME                <chr> "社会生活基本調査", "社会生活基…
$ GOV_ORG                  <chr> "総務省", "総務省", "総務省", "…
$ STATISTICS_NAME          <chr> "平成18年社会生活基本調査 調査票…
$ TITLE                    <chr> "男女,行動の種類(小分類,主行…
$ CYCLE                    <chr> "-", "-", "-", "-", "-", "-", "-…
$ SURVEY_DATE              <chr> "200610", "200610", "200610", "2…
$ OPEN_DATE                <chr> "2016-10-31", "2016-10-31", "201…
$ SMALL_AREA               <chr> "0", "0", "0", "0", "0", "0", "0…
$ COLLECT_AREA             <chr> "該当なし", "該当なし", "該当な…
$ MAIN_CATEGORY            <chr> "教育・文化・スポーツ・生活", "…
$ SUB_CATEGORY             <chr> "文化・スポーツ・生活", "文化・…
$ OVERALL_TOTAL_NUMBER     <chr> "39675", "39675", "39675", "4320…
$ UPDATED_DATE             <chr> "2022-08-17", "2022-08-17", "202…
$ TABULATION_CATEGORY      <chr> "平成18年社会生活基本調査", "平…
$ TABULATION_SUB_CATEGORY1 <chr> "調査票Bに基づく結果", "調査票…
$ TABULATION_SUB_CATEGORY2 <chr> "生活時間に関する結果", "生活時…
$ TABULATION_SUB_CATEGORY3 <chr> "生活時間編", "生活時間編", "生…
$ DESCRIPTION              <chr> "", "", "", "", "", "", "", "", …
$ TABLE_NAME               <chr> "男女,行動の種類(小分類,主行…
$ TABULATION_SUB_CATEGORY4 <chr> NA, NA, NA, NA, NA, NA, NA, NA, …
$ TABLE_SUB_CATEGORY1      <chr> NA, NA, NA, NA, NA, NA, NA, NA, …
stats_list_eg1 <- estat_getStatsList(appId = appId, searchWord = "", statsCode = "00450012")
glimpse(stats_list_eg1)
Rows: 2
Columns: 18
$ `@id`                    <chr> "0003109570", "0003109558"
$ STAT_NAME                <chr> "生命表", "生命表"
$ GOV_ORG                  <chr> "厚生労働省", "厚生労働省"
$ STATISTICS_NAME          <chr> "生命表 完全生命表", "生命表 簡…
$ TITLE                    <chr> "完全生命表", "簡易生命表"
$ CYCLE                    <chr> "-", "年次"
$ SURVEY_DATE              <chr> "0", "0"
$ OPEN_DATE                <chr> "2019-08-30", "2020-07-31"
$ SMALL_AREA               <chr> "0", "0"
$ COLLECT_AREA             <chr> "該当なし", "該当なし"
$ MAIN_CATEGORY            <chr> "人口・世帯", "人口・世帯"
$ SUB_CATEGORY             <chr> "人口動態", "人口動態"
$ OVERALL_TOTAL_NUMBER     <chr> "5840", "17784"
$ UPDATED_DATE             <chr> "2020-10-22", "2020-10-22"
$ TABULATION_CATEGORY      <chr> "生命表", "生命表"
$ TABULATION_SUB_CATEGORY1 <chr> "完全生命表", "簡易生命表"
$ DESCRIPTION              <chr> "", ""
$ TABLE_NAME               <chr> "完全生命表", "簡易生命表"
meta_info <- estat_getMetaInfo(appId = appId, statsDataId = "0003066844")
names(meta_info)
[1] "cat01"  "cat02"  "cat03"  "cat04"  "area"   "time"   ".names"
df1 <- estat_getStatsData(
  appId = appId,
  statsDataId = "0003066844",
  cdCat01 = "002",
  cdArea = "00000")
Fetching record 1-882... (total: 882 records)
glimpse(df1)
Rows: 882
Columns: 15
$ cat01_code                <chr> "002", "002", "002", "002", "00…
$ 行動の種類_2011           <chr> "睡眠", "睡眠", "睡眠", "睡眠",…
$ cat02_code                <chr> "001", "001", "001", "001", "00…
$ `性別-2011`               <chr> "総数", "総数", "総数", "総数",…
$ cat03_code                <chr> "001", "001", "001", "099", "09…
$ `時間帯別行動者率等-2011` <chr> "標本数", "標本数", "標本数", "…
$ cat04_code                <chr> "00100", "00200", "00300", "001…
$ `曜日-2011`               <chr> "平日", "土曜日", "日曜日", "平…
$ area_code                 <chr> "00000", "00000", "00000", "000…
$ `地域 _ 2011`             <chr> "全国", "全国", "全国", "全国",…
$ time_code                 <chr> "2011000000", "2011000000", "20…
$ `時間軸(年次)`            <chr> "2011年", "2011年", "2011年", "…
$ unit                      <chr> NA, NA, NA, "千人", "千人", "千…
$ value                     <dbl> NA, NA, NA, NA, NA, NA, 82.93, …
$ annotation                <chr> NA, NA, NA, NA, NA, NA, NA, NA,…
knitr::kable(head(df1,9))
cat01_code 行動の種類_2011 cat02_code 性別-2011 cat03_code 時間帯別行動者率等-2011 cat04_code 曜日-2011 area_code 地域 _ 2011 time_code 時間軸(年次) unit value annotation
002 睡眠 001 総数 001 標本数 00100 平日 00000 全国 2011000000 2011年 NA NA NA
002 睡眠 001 総数 001 標本数 00200 土曜日 00000 全国 2011000000 2011年 NA NA NA
002 睡眠 001 総数 001 標本数 00300 日曜日 00000 全国 2011000000 2011年 NA NA NA
002 睡眠 001 総数 099 10歳以上推定人口 00100 平日 00000 全国 2011000000 2011年 千人 NA NA
002 睡眠 001 総数 099 10歳以上推定人口 00200 土曜日 00000 全国 2011000000 2011年 千人 NA NA
002 睡眠 001 総数 099 10歳以上推定人口 00300 日曜日 00000 全国 2011000000 2011年 千人 NA NA
002 睡眠 001 総数 003 行動者率(0:00-0:15) 00100 平日 00000 全国 2011000000 2011年 82.93 NA
002 睡眠 001 総数 003 行動者率(0:00-0:15) 00200 土曜日 00000 全国 2011000000 2011年 82.12 NA
002 睡眠 001 総数 003 行動者率(0:00-0:15) 00300 日曜日 00000 全国 2011000000 2011年 80.86 NA

2.2.1 Rからestatapiパッケージを通してe-stat APIをつかう

Update: 2020.12.6 https://ronri-rukeichi.hatenablog.com/entry/2020/12/06/230445

res1 <- estat_getStatsList(appId = appId, searchWord = "産業 AND 年齢", surveyYears = "199001-199512",statsCode= "00200" ,limit=100, statsField = "03")
glimpse(res1)
Rows: 13
Columns: 18
$ `@id`                    <chr> "0000140293", "0000140562", "000…
$ STAT_NAME                <chr> "就業構造基本調査", "就業構造基…
$ GOV_ORG                  <chr> "総務省", "総務省", "総務省", "…
$ STATISTICS_NAME          <chr> "平成4年就業構造基本調査 全国編"…
$ TITLE                    <chr> "従業上の地位(2),産業(35…
$ CYCLE                    <chr> "-", "-", "-", "-", "-", "-", "-…
$ SURVEY_DATE              <chr> "199210", "199210", "199210", "1…
$ OPEN_DATE                <chr> "2007-08-31", "2007-08-31", "200…
$ SMALL_AREA               <chr> "0", "0", "0", "0", "0", "0", "0…
$ COLLECT_AREA             <chr> "該当なし", "該当なし", "該当な…
$ MAIN_CATEGORY            <chr> "労働・賃金", "労働・賃金", "労…
$ SUB_CATEGORY             <chr> "労働力", "労働力", "労働力", "…
$ OVERALL_TOTAL_NUMBER     <chr> "210", "6084", "2520", "3240", "…
$ UPDATED_DATE             <chr> "2023-02-28", "2023-02-28", "202…
$ TABULATION_CATEGORY      <chr> "平成4年就業構造基本調査", "平成…
$ TABULATION_SUB_CATEGORY1 <chr> "全国編", "地域編", "全国編", "…
$ DESCRIPTION              <chr> "", "", "", "", "", "", "", "", …
$ TABLE_NAME               <chr> "従業上の地位(2),産業(35…

2.2.1.1 meta data

meta1 <-  estat_getMetaInfo(appId,"0000140440" )
glimpse(meta1)
List of 7
 $ cat01 : tibble [2 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:2] "000" "001"
  ..$ @name : chr [1:2] "総数" " うち雇用者"
  ..$ @level: chr [1:2] "1" "1"
 $ cat02 : tibble [3 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:3] "000" "001" "002"
  ..$ @name : chr [1:3] "男女計" " 男" " 女"
  ..$ @level: chr [1:3] "1" "1" "1"
 $ cat03 : tibble [13 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:13] "000" "001" "002" "003" ...
  ..$ @name : chr [1:13] "総数" " 農林業" " 漁業" " 鉱業" ...
  ..$ @level: chr [1:13] "1" "1" "1" "1" ...
 $ cat04 : tibble [13 × 4] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr [1:13] "000" "001" "002" "003" ...
  ..$ @name : chr [1:13] "総数" " 農林業" " 漁業" " 鉱業" ...
  ..$ @level: chr [1:13] "1" "1" "1" "1" ...
  ..$ @unit : chr [1:13] "千人" "千人" "千人" "千人" ...
 $ area  : tibble [1 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr "00000"
  ..$ @name : chr "全国"
  ..$ @level: chr "1"
 $ time  : tibble [1 × 3] (S3: tbl_df/tbl/data.frame)
  ..$ @code : chr "1992000000"
  ..$ @name : chr "1992年"
  ..$ @level: chr "1"
 $ .names: tibble [6 × 2] (S3: tbl_df/tbl/data.frame)
  ..$ id  : chr [1:6] "cat01" "cat02" "cat03" "cat04" ...
  ..$ name: chr [1:6] "従業上の地位140014" "男女別140001" "産業140015" "産業・1年前140087" ...
dta1_f <- estat_getStatsData(appId ,"0000140440" ,cdCat02 = c("002"))
Fetching record 1-338... (total: 338 records)
glimpse(dta1_f)
Rows: 338
Columns: 15
$ cat01_code           <chr> "000", "000", "000", "000", "000", "…
$ 従業上の地位140014   <chr> "総数", "総数", "総数", "総数", "総…
$ cat02_code           <chr> "002", "002", "002", "002", "002", "…
$ 男女別140001         <chr> " 女", " 女", " 女", " 女", " …
$ cat03_code           <chr> "000", "000", "000", "000", "000", "…
$ 産業140015           <chr> "総数", "総数", "総数", "総数", "総…
$ cat04_code           <chr> "000", "001", "002", "003", "004", "…
$ `産業・1年前140087` <chr> "総数", " 農林業", " 漁業", " 鉱…
$ area_code            <chr> "00000", "00000", "00000", "00000", …
$ 全国140001           <chr> "全国", "全国", "全国", "全国", "全…
$ time_code            <chr> "1992000000", "1992000000", "1992000…
$ `時間軸(年次)`       <chr> "1992年", "1992年", "1992年", "1992…
$ unit                 <chr> "千人", "千人", "千人", "千人", "千…
$ value                <dbl> 1412, 12, 2, 0, 42, 338, 2, 39, 457,…
$ annotation           <chr> NA, NA, NA, NA, NA, NA, NA, NA, NA, …
catalog1 <- estat_getDataCatalog(appId, searchWord = "チョコレート", dataType = c("CSV"))

2.2.2 Rからe-Statデータ取得

estat_getStatsList(appId = appId, 
                   searchWord = "",
                   statsCode = "00200521")

政府統計コード表:https://www.e-stat.go.jp/stat-search/database?page=1

2.2.3 estatapi を用いた公的統計の利活用

昼夜間人口に基づく発見地自殺死亡率の指標作成 久保田 貴文(多摩大学)

https://www.jstage.jst.go.jp/article/jscstaikai/33/0/33_93/_pdf/-char/ja

2.2.4 その無茶振り,(Rで)GISが解決します:フローデータ分析編(e-Stat使い倒しの巻)

Keisuke Takano: https://rpubs.com/k_takano/r_de_geonw_app

2.2.4.1 県外進学者データ

学校基本調査の統計表の一覧を取得 estatapiのestat_getStatsList関数を用いて,学校基本調査に該当する統計表の一覧を取得します.統計表の検索方法はいくつかありますが,今回は,政府統計コードを用いた検索を行います.政府統計コードの一覧はこちらのページにあります.学校基本統計調査のコードは「00400001」と書いてありますので,引数statsCodeに,こちらを指定します.引数appIdには先程入力したappIdを,searchWordはブランクを指定してください.

tbl_info_school <- estatapi::estat_getStatsList(appId=appId,
                                                statsCode="00400001",
                                                searchWord="")
tbl_info_school
glimpse(tbl_info_school)
Rows: 7,801
Columns: 26
$ `@id`                    <chr> "0003061540", "0003015869", "000…
$ STAT_NAME                <chr> "学校基本調査", "学校基本調査", …
$ GOV_ORG                  <chr> "文部科学省", "文部科学省", "文…
$ STATISTICS_NAME          <chr> "学校基本調査 平成18年度 初等…
$ TITLE                    <chr> "総括", "都道府県別 学校数", "…
$ CYCLE                    <chr> "-", "-", "-", "-", "-", "-", "-…
$ SURVEY_DATE              <chr> "0", "0", "200604-200703", "2006…
$ OPEN_DATE                <chr> "2007-12-21", "2007-12-07", "200…
$ SMALL_AREA               <chr> "0", "0", "0", "0", "0", "0", "0…
$ COLLECT_AREA             <chr> "該当なし", "該当なし", "該当な…
$ MAIN_CATEGORY            <chr> "教育・文化・スポーツ・生活", "…
$ SUB_CATEGORY             <chr> "学校教育", "学校教育", "学校教…
$ OVERALL_TOTAL_NUMBER     <chr> "526", "960", "224", "4", "960",…
$ UPDATED_DATE             <chr> "2019-10-28", "2012-03-02", "201…
$ TABULATION_CATEGORY      <chr> "学校基本調査", "学校基本調査", …
$ TABULATION_SUB_CATEGORY1 <chr> "平成18年度", "平成18年度", …
$ TABULATION_SUB_CATEGORY2 <chr> "初等中等教育機関・専修学校・各…
$ TABULATION_SUB_CATEGORY3 <chr> "学校調査・学校通信教育調査(高…
$ TABULATION_SUB_CATEGORY4 <chr> "総括", "小学校", "小学校", "小…
$ DESCRIPTION              <chr> "", "", "", "", "", "", "", "", …
$ TABLE_NAME               <chr> "総括", "都道府県別 学校数", "…
$ TABULATION_SUB_CATEGORY5 <chr> NA, NA, NA, NA, NA, NA, NA, NA, …
$ TABLE_SUB_CATEGORY1      <chr> NA, NA, NA, NA, NA, NA, NA, NA, …
$ TABLE_SUB_CATEGORY2      <chr> NA, NA, NA, NA, NA, NA, NA, NA, …
$ TABLE_SUB_CATEGORY3      <chr> NA, NA, NA, NA, NA, NA, NA, NA, …
$ TABLE_CATEGORY           <chr> NA, NA, NA, NA, NA, NA, NA, NA, …

今回は例として,2010年の県外進学データを取得します.項目STATISTICS_NAMEに「平成22年」「大学・大学院」,TITLEに「出身高校の所在地県別 入学者数」を含むデータがその候補になりますので,統計表情報からそちらを抽出します.

tbl_info_school_mig_2010 <- tbl_info_school %>%
  dplyr::filter(grepl("平成22年",STATISTICS_NAME)&
                  grepl("大学・大学院",STATISTICS_NAME)&
                  grepl("出身高校の所在地県別 入学者数",TITLE))
tbl_info_school_mig_2010
mig_2010 <- estatapi::estat_getStatsData(appId=appId,
                                         statsDataId=tbl_info_school_mig_2010$`@id`)
Fetching record 1-9408... (total: 9408 records)
head(mig_2010)

「XX_1」となっている方が大学の所在地に関する変数,「XX_2」は出身高校の所在地に関する変数です.即ち,「XX_1」は着地側,「XX_2」は発地側の位置情報です.変数valueが,都道府県ペア間の県外進学数です.変数「設置者別9」には,大学の設置者及び性別を区別する変数です.都道府県コードに対応する変数は,大学の所在地についてのみ把握できます.  出身高校の所在地の変数「都道府県別2」について,その値を確認すると,「都道府県」が抜けていることがわかります.  

unique(mig_2010$都道府県別2)
 [1] "計"     "北海道" "青森"   "岩手"   "宮城"   "秋田"   "山形"  
 [8] "福島"   "茨城"   "栃木"   "群馬"   "埼玉"   "千葉"   "東京"  
[15] "神奈川" "新潟"   "富山"   "石川"   "福井"   "山梨"   "長野"  
[22] "岐阜"   "静岡"   "愛知"   "三重"   "滋賀"   "京都"   "大阪"  
[29] "兵庫"   "奈良"   "和歌山" "鳥取"   "島根"   "岡山"   "広島"  
[36] "山口"   "徳島"   "香川"   "愛媛"   "高知"   "福岡"   "佐賀"  
[43] "長崎"   "熊本"   "大分"   "宮崎"   "鹿児島" "沖縄"   "その他"

このままでは分析上扱いにくいので,変数「都道府県別2」に「都道府県」を補ったものを,新たな変数origin_nameとして追加します.

mig_2010_long <- mig_2010 %>%
  dplyr::mutate(origin_name=case_when(
    #「京都」「大阪」なら「府」を補う
    都道府県別2%in%c("京都","大阪") ~ paste0(都道府県別2,"府"),
    #「東京」なら「都」を補う
    都道府県別2=="東京" ~ "東京都",
    #「北海道」「その他」「計」なら何も補わない
    都道府県別2%in%c("北海道","その他","計") ~ 都道府県別2,
    #上に該当しなければ「県」を補う
    TRUE ~ paste0(都道府県別2,"県")
    ))

着地側の変数「都道府県1」は特に何かを補う必要もなさそうなので,変数名をdestination_nameに変更し,そのままにしておきます.また,変数「設置者別9」を「founder」に変えた上で,発着地名が「その他」「計」「全国」に該当しないレコードのみ残します.

mig_2010_long <- mig_2010_long %>%
  #着地側の変数の名前を変更
  dplyr::rename(destination_name=都道府県別1) %>%
  #設置者を示す変数の名前を変更
  dplyr::rename(founder=設置者別9) %>%
  #必要な変数のみ残す
  dplyr::select(founder,origin_name,destination_name,value) %>%
  #発着地名が「その他」「計」「全国」に該当しないレコードのみ残す
  dplyr::filter(!(origin_name%in%c("その他","計","全国")|
                    destination_name%in%c("その他","計","全国")))
head(mig_2010_long)

元データから,都道府県名と都道府県コードの対応表を作ります.都道府県名は変数「都道府県別1」をそのまま用いることができますが,都道府県コードは変数area_codeの先頭2文字を取り出す必要があります.それら変数を作成した上で,都道府県名・都道府県コードの2変数についてデータをユニークにします.

pref_code <- mig_2010 %>%
  #必要な変数のみ残す
  dplyr::select(都道府県別1,area_code) %>%
  #都道府県名pref_nameの値は,都道府県別1の値そのまま
  dplyr::mutate(pref_name=都道府県別1,
                #都道府県コードpref_codeの値はarea_codeの先頭2文字
                pref_code=substr(x=area_code,start=1,stop=2)) %>%
  #都道府県名・コードでユニーク化
  dplyr::distinct(pref_name,pref_code)

都道府県名をキーに,発地・着地側に都道府県コードを結合します.

mig_2010_long <- mig_2010_long %>%
  #発地側に都道府県コードを結合
  dplyr::left_join(y=pref_code,by=c("origin_name"="pref_name")) %>%
  #都道府県コードの変数名を変更
  dplyr::rename(origin=pref_code) %>%
  #着地側に都道府県コードを結合
  dplyr::left_join(y=pref_code,by=c("destination_name"="pref_name")) %>%
  #都道府県コードの変数名を変更
  dplyr::rename(destination=pref_code)

最後に,現状縦に並んでいる設立者・性別毎のデータを,横並びに変形します.前者はlong型,後者はwide型とも呼びます.変数founderを基準に,データをwide型へ変換する際は,tidyrのpivot_wider関数を用いて以下のように実行します.Wide型に変換しない変数を引数id_colsで,新たに作られる変数の名前に変数founderの値を用いることを引数names_fromで,wide型に変形される観測値は変数valueから来ることを引数values_fromで明示します.

mig_2010_wide <- mig_2010_long %>%
  #Wide型に変換しない変数の指定
  tidyr::pivot_wider(id_cols=c(origin_name,destination_name,origin,destination),
                     #新たな変数名の元になる値が入った変数
                     names_from=founder,
                     #Wide型に変換される観測値が入った変数
                     values_from=value)
head(mig_2010_wide)

変数名が日本語のままだと扱いづらいので,英語で変数名を付け直します.また,進学者総数から男子の進学者数を差し引いたものを,女子の進学者数として変数に追加します.

mig_2010_wide <- mig_2010_wide %>%
  #変数名を付け直す
  dplyr::rename(total=計,
                national=国立,
                private=私立,
                male=計のうち男) %>%
  #女子の進学者数を計算
  dplyr::mutate(female=total-male)

上で作成したデータは,発着地ペアについてフロー量が縦に並んでいる形式です.一方,よく見るOD表は,行方向に発地側の地名,列方向に着地側の地名が並んだ正方行列の形のものだと思います.以下では,発着地ペアのデータをOD表の形式に変形する方法を示します.  例として,進学者総数についてOD表を作成します.表の行方向には発地側都道府県名,列方向には着地側都道府県名が並ぶ形にします.この変形には ,上と同様pivot_wider関数が使えます.引数id_colsには行方向のラベルとなる発地側都道府県名origin_name,引数names_fromには変数名となる着地側都道府県名destination_name,引数values_fromには並べ替えられる進学者総数totalを指定します.  

mig_2010_total_od <- mig_2010_wide %>%
  #データをOD表の形式に変形
  tidyr::pivot_wider(id_cols=c(origin_name),
                     names_from=destination_name,
                     values_from=total)
head(mig_2010_total_od)

2.2.4.2 地域属性データ

社会・人口統計体系の統計表の一覧を取得

今回重力モデルの説明変数として用いるデータは,社会・人口統計体系(統計でみる都道府県・市区町村のすがた)から取得します.社会・人口統計体系は,各地域の様々な社会・経済属性のうち基礎的なものを,都道府県・市区町村単位で集計したデータで,卒業論文等での利用頻度が高いもののひとつです.社会・人口統計体系は,社会・経済変数の生の値をまとめた基礎データと,それら変数を組み合わせて計算される各種指標をまとめた社会生活統計指標に分類されます.  まずは,社会・人口統計体系を政府統計コードの一覧から探します.コードは「00200502」ですので,学校基本調査の場合と同じく,estat_getStatsListを用いて統計表のリストを取得します.  

#社会・人口統計体系の統計表の一覧
tbl_info_si <- estatapi::estat_getStatsList(appId=appId,
                                            statsCode="00200502",
                                            searchWord="")
head(tbl_info_si)

統計表のリストを,都道府県データ(項目COLLECT_AREAが「都道府県」を含む)のみに絞ります

tbl_info_si_pref <- tbl_info_si %>%
  #項目COLLECT_AREAが「都道府県」を含むレコードに絞る
  dplyr::filter(grepl("都道府県",COLLECT_AREA))
head(tbl_info_si_pref)

2.2.4.3 基礎データ・社会生活統計指標から必要な統計表をダウンロード

今回の分析では,基礎データ・社会生活統計指標のそれぞれから,以下の変数を用います.

基礎データ C121101:1人当たり県民所得 社会生活統計指標 #E0610202:大学収容力指数 #E09504:大卒者割合 1人当たり県民所得については,項目STATISTICS_NAMEに「基礎データ」,TITLEに「C」を含む統計表に含まれます.それ以外の変数は,項目STATISTICS_NAMEに「社会生活統計指標」,TITLEに「E」を含む統計表がその候補になりますので,統計表情報からそちらを抽出します.

tbl_info_si_pref_vars <- tbl_info_si_pref %>%
  #項目STATISTICS_NAMEに「基礎データ」,TITLEに「C」を含む,もしくは
  dplyr::filter((grepl("基礎データ",STATISTICS_NAME)&grepl("C",TITLE))|
                  #項目STATISTICS_NAMEに「社会生活統計指標」,TITLEに「E」を含む
                  (grepl("社会生活統計指標",STATISTICS_NAME)&grepl("E",TITLE)))

基礎データCの統計表IDは「0000010103」,社会生活統計指標Eの統計表IDは「0000010205」ですので,それぞれestat_getStatsData関数で統計表を取得します.

#基礎データCの統計表を取得
kiso_c <- estatapi::estat_getStatsData(appId=appId,
                                       statsDataId="0000010103")
Fetching record 1-100000... (total: 319920 records)

Fetching record 100001-200000... (total: 319920 records)

Fetching record 200001-300000... (total: 319920 records)

Fetching record 300001-319920... (total: 319920 records)
#社会生活統計指標Eの統計表を取得
sihyo_e <- estatapi::estat_getStatsData(appId=appId,
                                        statsDataId="0000010205")
Fetching record 1-100000... (total: 102864 records)

Fetching record 100001-102864... (total: 102864 records)

取得された各統計表から,必要なレコードのみを残します.具体的には,統計コードcat01_codeが上で挙げた変数コードに一致し,かつ調査年が「2010年度」に一致するもののみを残します.その上で,それらを行方向に結合します.

kiso_c_vars <- kiso_c %>%
  #1人当たり県民所得
  dplyr::filter(cat01_code=="C121101") %>%
  #2010年度の観測値
  dplyr::filter(調査年=="2010年度") %>%
  #不要な変数を削除
  dplyr::select(-`C 経済基盤`)
sihyo_e_vars <- sihyo_e %>%
  #大学収容力指数
  dplyr::filter(cat01_code=="#E0610202"|
                  cat01_code=="#E09504") %>%
  #2010年度の観測値
  dplyr::filter(調査年=="2010年度") %>%
  #不要な変数を削除
  dplyr::select(-`E 教育`)
#データを行方向に結合
vars <- rbind(kiso_c_vars,sihyo_e_vars)

データを変数毎にwide型に変形します.前もって必要な変数のみ残し,変数area_codeの先頭2文字から都道府県コードを新たな変数として作成します.また,変数コードcat01_codeに基づいて,変形後の変数名を与える変数varnamを作成します.その上で,データをlong型からwide型に変形します.

vars <- vars %>%
  #都道府県コード変数を追加
  dplyr::mutate(pref_code=substr(x=area_code,start=1,stop=2)) %>%
  #必要な変数のみ残す
  dplyr::select(cat01_code,pref_code,地域,value) %>%
  #変数名を変更
  dplyr::rename(pref_name=地域) %>%
  #変数コードに応じた変数を作成
  dplyr::mutate(varnam=dplyr::case_when(
    cat01_code=="C121101" ~ "income",
    cat01_code=="#E0610202" ~ "acom_univ",
    cat01_code=="#E09504" ~ "univ_rate"
  ))
vars_wide <- vars %>%
  #データをlong型からwide型に変形
  tidyr::pivot_wider(id_cols=c(pref_code,pref_name),
                     names_from=varnam,
                     values_from=value)
head(vars_wide)

データを結合し,書き出します.

2.2.4.4 都道府県庁ポイント

取得元:国土数値情報 国・都道府県の機関データ

#Shapefileを読み込み
pref_office <- sf::read_sf(dsn="P28-13.shp") %>%
  #変数P28_003が「12001」(都道府県庁舎)のレコードのみ残す
  dplyr::filter(P28_003=="12001") %>%
  #都道府県コードの変数を作成
  dplyr::mutate(pref_code=substr(P28_001,1,2)) %>%
  #都道府県コードの変数だけ残す
  dplyr::select(pref_code) %>%
  #都道府県コードでソート
  dplyr::arrange(pref_code) %>%
  #WGS84/UTM54Nに投影変換
  sf::st_transform(crs=sf::st_crs(32654))
Error: Cannot open "P28-13.shp"; The file doesn't seem to exist.

都道府県ポリゴン

https://rpubs.com/k_takano/r_de_geonw_app

2.2.4.5 国土数値情報ダウンロードサイト

https://nlftp.mlit.go.jp/ksj/index.html

2.2.4.6 Other Sites

mapdata: extra map data for a few regions

2.2.5 Examples

3 参考 References

LS0tCnRpdGxlOiAiZS1TdGF0IHdpdGggQVBJIgphdXRob3I6ICJEUy1TTCIKZGF0ZTogImByIFN5cy5EYXRlKClgIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0b2M6IHllcwogICAgdG9jX2Zsb2F0OiB5ZXMKICBwZGZfZG9jdW1lbnQ6CiAgICB0b2M6IHllcwotLS0KCiMg44Gv44GY44KB44Gm44GuIGUtU3RhdCB3aXRoIEFQSQoK44Gv44GY44KB44Gm44CBUiDjga4gYGV0YXRhcGlgIOOCkuS9v+OBo+OBpuOAgWUtU3RhdCDjga7jg4fjg7zjgr/jgpLlj5blvpfjgZnjgovmlrnms5XjgpLnsKHljZjjgavoqqzmmI7jgZfjgb7jgZnjgIIKCiMjIOWIneacn+ioreWumiB7LX0KCuODkeODg+OCseODvOOCuOOBruOAgWBlc3RhdGFwaWAg44GM44CBZS1TdGF0IOOBruODh+ODvOOCv+OCkuWPluW+l+OBmeOCi+OBn+OCgeOBruOCguOBruOBp+OBmeOAgmB0aWR5dmVyc2VgIOOBr+WfuuacrOeahOOBquino+aekOOCkuOBiuOBk+OBquOBhuOBn+OCgeOAgWBzaG93dGV4dGAg44GoIGBzaG93dGV4dF9hdXRvKClgIOOBr+OAgeOCsOODqeODleOBquOBqeOBq+OAgeaXpeacrOiqnuOBjOWQq+OBvuOCjOOCi+WgtOWQiOOBruaWh+Wtl+WMluOBkeOCkumYsuOBkOOBn+OCgeOBruOCguOBruOBp+OBmeOAggoK44Kk44Oz44K544OI44O844Or44GV44KM44Gm44GE44Gq44GE44OR44OD44Kx44O844K444GM44GC44KK44G+44GX44Gf44KJ44CB5LiK44Gu44Oh44OL44Ol44O844GuIFRvb2xzID4gSW5zdGFsbCBQYWNrYWdlcyDjgYvjgonjgIHjgqTjg7Pjgrnjg4jjg7zjg6vjgZfjgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyfQpsaWJyYXJ5KHRpZHl2ZXJzZSkKbGlicmFyeShzaG93dGV4dCkKbGlicmFyeShlc3RhdGFwaSkKc2hvd3RleHRfYXV0bygpCmBgYAoKIyMgZS1TdGF0IOeZu+mMsuOBqOOAgeOCouODl+ODquOCseODvOOCt+ODp+ODs0lE44Gu5Y+W5b6XCgplLVN0YXQgQVBJIOOCkuWIqeeUqOOBmeOCi+OBq+OBr+OAgWFwcElkIOOBjOW/heimgeOBp+OBmeOAggoKMS4gZS1zdGF0OiBodHRwczovL3d3dy5lLXN0YXQuZ28uanAvIOOBruODmuODvOOCuOOBuOihjOOBj+OAggoyLiDlj7PkuIrjga7mlrDopo/nmbvpjLLjgYvjgonjgIHjgqLjgqvjgqbjg7Pjg4jnmbvpjLLjgpLjgZfjgb7jgZnjgIIKICAgIC0g44Oh44O844Or44Ki44OJ44Os44K544KS5YWl5Yqb44GX44CB44Gd44GT44Gr5bGK44GE44Gm44Oq44Oz44Kv44KS6ZaL44GN44CB44OR44K544Ov44O844OJ44KS6Kit5a6a44CCCiAgICAtIOODkeOCueODr+ODvOODieioreWumuOBr+OAgUdvb2dsZSDjgarjganjga7jgqLjgqvjgqbjg7Pjg4jpgKPmkLrjgafjgZnjgovjgZPjgajjgoLlj6/og73jgafjgZnjgIIKMy4g44Ki44Kr44Km44Oz44OI44Gr44Ot44Kw44Kk44Oz44CC5LiK44Gu5biv44Gr44CB44Oh44O844Or44Ki44OJ44Os44K544GM6KGo56S644GV44KM44G+44GZ44CCCjQuIOOBneOBruWPs+OBruODnuOCpOODmuODvOOCuOOBq+ihjOOBjeOAgUFQSeapn+iDve+8iOOCouODl+ODquOCseODvOOCt+ODp+ODs0lE55m66KGM77yJ44G444CC44G+44Ga44CB5b+F6KaB5LqL6aCF44Gu5YWl5Yqb44GM5b+F6KaB44Gn44GZ44GM44CB6Kqs5piO44KS44G/44Gm44GP44Gg44GV44GE44CCCiAgICAtIOWQjeensO+8mkFQSeapn+iDveOCkuWIqeeUqOOBmeOCi+OCouODl+ODquOCseODvOOCt+ODp+ODs+WQje+8iOOCt+OCueODhuODoOWQjeetie+8iS0gUiDjgb7jgZ/jga/jgIFSU3R1ZGlvCiAgICAtIFVSTO+8muOCouODl+ODquOCseODvOOCt+ODp+ODs+OBrlVSTO+8iOODiOODg+ODl+ODmuODvOOCuOetieOBrlVSTO+8iQoqIElmIHlvdSBkbyBub3QgdXNlIGl0IG9uIHRoZSBwdWJsaWMgc2l0ZSwgcGxlYXNlIGVudGVyICJodHRwOiAvLyB0ZXN0LmxvY2FsaG9zdCAvIiBldGMuIC0gbG9jYWxob3N0IOOBp+OCiOOBhOOBp+OBl+OCh+OBhuOAggogICAgLSDmpoLopoHvvJrjgqLjg5fjg6rjgrHjg7zjgrfjg6fjg7PvvIjjgrfjgrnjg4bjg6DvvInjga7mpoLopoEgLSBlc3RhdGFwaSDjgajjgafjgoLmm7jjgYTjgabjgYrjgZHjgbDoia/jgYTjgafjgZfjgofjgYbjgIIKICAgIC0g5Y+z44Gu55m66KGM44KS5oq844GZ44Go44CBYXBwSWQg44GM6KGo56S644GV44KM44G+44GZ44CC44GT44KM44KS6KiY6Yyy44CCCgojIyDmnIDliJ3jga7kvosKCmBgYAphcHBJZCA8LSAiICIgIyDnp4Hjga7jgoLjga7jga/jgIHoi7HmlbA0MOaWh+WtlwpgYGAKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmFwcElkIDwtIHJlYWRfbGluZXMoIi4vLi4vLi4vLi4vX2RhdGEva2V5L2VzdGF0a2V5LnR4dCIpCmBgYAoK5Lul5LiL44Gu5b2i5byP44Gn44OH44O844K/44KS5Y+W5b6X44GZ44KL44CCYXBwSUQg44Gv5LiK44Gn5oyH5a6a44GX44Gf44KC44Gu44CCYXBwSWQg44Gu5aC05omA44KS44CB5a6f6Zqb44Gu44KC44Gu44Gn572u44GN5o+b44GI44Gm44KC6Imv44GE44GM44CB5Lq644Gr6KaL44Gb44KL44KC44Gu44Gn44Gv44Gq44GE44Gu44Gn44CBYXBwSWQg44Go44GX44Gm44CB572u44GN5o+b44GI44Gm44GK44GP44Gu44GM44KI44GE44Gg44KN44GG44CCCgrlv4XopoHjgarjga7jga/jgIFzdGF0c0RhdGFJZCDjgafjgIHjgZnjgbnjgabjga7jg4fjg7zjgr/jgavjgZPjga4gSUQg44GM5oyv44KJ44KM44Gm44GE44KL44KP44GR44Gn44Gv44Gq44GE44CC44OH44O844K/44KS44GX44KJ44G544Gm44CBQVBJIOOBruihqOekuuOBjOOBguOCi+OCguOBruOBr+OAgeOBneOCjOOCkumWi+OBj+OBqOOAgemAlOS4reOBq+OAgQoKYHN0YXRzRGF0YUlkPTAwMDMwMDkxODlgCgrjgarjganjga7pg6jliIbjgYzjgYLjgovjga7jgafjgIHjgZPjga4xMOahgeOBrueVquWPt+OCkuOCs+ODlOODvOOBl+OBpuiyvOOCiuS7mOOBkeOCi+OAgjjmoYHjga7jgIzmlL/lupzntbHoqIjjgrPjg7zjg4njgI3jgafjga/jgarjgYTjga7jgafjgIHmt7fkubHjgZfjgarjgYTjgZPjgajjgIIKCmBzdGF0c0RhdGFJZGAg5Y+W5b6X44Gr44Gk44GE44Gm44Gv44CB5pyA5b6M44Gu44CM5Y+C6ICD44CN44Gr5bCR44GX5pu444GE44Gm44GC44KK44G+44GZ44CCCgrjg4Djgqbjg7Pjg63jg7zjg4njgZfjgZ/jg4fjg7zjgr/jgpLjgYLjgajjgafkvb/jgYbjgZ/jgoHjgavlkI3liY3jgpLoqK3lrprjgZnjgovjgIIKCmBgYApkYXRhMCA8LSBlc3RhdF9nZXRTdGF0c0RhdGEoYXBwSWQsIHN0YXRzRGF0YUlkID0gIjEyMzQ1Njc4OTAiCikKZGF0YTAKYGBgCgrjg6Hjgr/jg7vjg4fjg7zjgr/jga/jgIHlkIzjgZjjgojjgYbjgavjgIFgZXN0YXRfZ2V0TWV0YUluZm9gIOOBp+W+l+OCieOCjOOCi+OAggoKYGBgCmRhdGEwbSA8LSBlc3RhdF9nZXRNZXRhSW5mbyhhcHBJZCwgc3RhdHNEYXRhSWQgPSAiMTIzNDU2Nzg5MCIpCmRhdGEwbQpgYGAKCiMjIyDkvosxIOekvuS8muODu+S6uuWPo+e1seioiOS9k+ezuwoKW+ekvuS8muODu+S6uuWPo+e1seioiOS9k+ezuyAvIOmDvemBk+W6nOecjOODh+ODvOOCvyAvIOWfuuekjuODh+ODvOOCv10oaHR0cHM6Ly93d3cuZS1zdGF0LmdvLmpwL3N0YXQtc2VhcmNoL2RhdGFiYXNlP3BhZ2U9MSZzdGF0ZGlzcF9pZD0wMDAwMDEwMTAzKQoKYGBge3IgY2FjaGUgPSBUUlVFfQpkZjEgPC0gZXN0YXRfZ2V0U3RhdHNEYXRhKGFwcElkLHN0YXRzRGF0YUlkID0gIjAwMDAwMTAxMDMiKQpkZjEKYGBgCmBgYHtyfQpnbGltcHNlKGRmMSkKYGBgCgpgYGB7ciBjYWNoZSA9IFRSVUV9CmRmMW0gPC0gZXN0YXRfZ2V0TWV0YUluZm8oYXBwSWQsIHN0YXRzRGF0YUlkID0gIjAwMDAwMTAxMDMiKQpnbGltcHNlKGRmMW0pCmBgYAoKYGBge3J9CmRmMW0kdGFiCmBgYAoK44Kz44O844OJ77yIY2F0MDFfY29kZe+8ieOBq+OCiOOBo+OBpuOAgeWQhOODh+ODvOOCv+OBjOWIhumhnuOBleOCjOOBpuOBhOOCi+OAggoKYGBge3J9CmRmMW0kY2F0MDEKYGBgCgpgYGB7cn0KZGYxbSRhcmVhCmBgYAoKYGBge3J9CmRmMW0kdGltZQpgYGAKCmBgYHtyfQpkZjFtJC5uYW1lcwpgYGAKCmBgYHtyfQpkZjEgJT4lIGZpbHRlcihjYXQwMV9jb2RlICVpbiUgYygnQzExMDEnLCAnQzExMDInKSkgJT4lCiAgZmlsdGVyKOWcsOWfnyA9PSAi5YWo5Zu9IikgJT4lCiAgZ2dwbG90KGFlcyjoqr/mn7vlubQsIHZhbHVlLCBjb2xvciA9IGNhdDAxX2NvZGUpKSArIGdlb21fcG9pbnQoKQpgYGAKCuiqv+afu+W5tOOBjOaWh+Wtl+ODh+ODvOOCv+OBquOBruOBp+OAgeaVsOWApOOBrumAo+e2muODh+ODvOOCv+OBqOOBl+OBpuOAgeaKmOOCjOe3muOCsOODqeODleOBq+OBr+aPj+OBkeOBvuOBm+OCk+OAguS4gOaXpuOAgeaVsOWApOODh+ODvOOCv+OBq+OBl+OBpuOAgeOBneOCjOOBi+OCieOAgeODqeODmeODq+OBoOOBkeabuOOBjeaPm+OBiOOCi+W/heimgeOBjOOBguOCiuOBvuOBmeOAguOBvuOBmuOAgeaVsOWApOODh+ODvOOCv+OBq+OBmeOCi+OBn+OCgeOAgeiqv+afu+W5tOOBruacgOWIneOBruWbm+OBpOOBruaVsOWtl+OCkuWPluOCiuWHuuOBl+OBvuOBmeOAggoKYGBge3J9CmRmMSAlPiUgZmlsdGVyKGNhdDAxX2NvZGUgJWluJSBjKCdDMTEwMScsICdDMTEwMicpKSAlPiUKICBmaWx0ZXIo5Zyw5Z+fID09ICLlhajlm70iKSAlPiUgbXV0YXRlKHllYXIgPSBhcy5udW1lcmljKHN0cmluZ3I6OnN0cl9zdWIo6Kq/5p+75bm0LCAxTCwgNEwpKSkgJT4lCiAgc2VsZWN0KGNhdDAxX2NvZGUsIHllYXIsIHZhbHVlKQpgYGAKCgpgYGB7cn0KZGYxICU+JSBmaWx0ZXIoY2F0MDFfY29kZSAlaW4lIGMoJ0MxMTAxJywgJ0MxMTAyJykpICU+JQogIGZpbHRlcijlnLDln58gPT0gIuWFqOWbvSIpICU+JSBtdXRhdGUoeWVhciA9IGFzLm51bWVyaWMoc3RyaW5ncjo6c3RyX3N1Yijoqr/mn7vlubQsIDFMLCA0TCkpKSAlPiUgCiAgZ2dwbG90KGFlcyh5ZWFyLCB2YWx1ZSwgY29sb3IgPSBjYXQwMV9jb2RlKSkgKyBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJDMTEwMV/nnIzlhoXnt4/nlJ/nlKPpoY3vvIjlubPmiJAxN+W5tOWfuua6lu+8iSwgQzExMDJf55yM5YaF57eP55Sf55Sj6aGN77yI55Sj5qWt77yJ77yI5bmz5oiQMTflubTln7rmupbvvIkiLCB4ID0gIiIsIHkgPSAiIiwgY29sb3IgPSAiIikgKyBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDE5NzUsMjAyMSwyKSwgbGFiZWxzID0gcGFzdGUwKHNlcSgxOTc1LDIwMjEsMiksIuW5tOW6piIpKQpgYGAKCiMjIyDkvosy44CA5bm06b2i5Yil5Lq65Y+jCgoKYGBge3IgY2FjaGUgPSBUUlVFfQpkZjIgPC0gZXN0YXRfZ2V0U3RhdHNEYXRhKGFwcElkLCBzdGF0c0RhdGFJZCA9ICIwMDAzNDQ4MjI4IikKZGYyCmBgYApgYGB7ciBjYWNoZSA9IFRSVUV9CmRmMm0gPC0gZXN0YXRfZ2V0TWV0YUluZm8oYXBwSWQsIHN0YXRzRGF0YUlkID0gIjAwMDM0NDgyMjgiKQpnbGltcHNlKGRmMm0pCmBgYAoKIyMjIOS6uuWPo++8muWwsealreeKtuaFiwoKYGBge3IgY2FjaGUgPSBUUlVFfQpkZjMgPC0gZXN0YXRfZ2V0U3RhdHNEYXRhKGFwcElkLCBzdGF0c0RhdGFJZCA9ICIwMDAzMDA5MTg5IikKZGYzCmBgYAoKCmBgYHtyIGNhY2hlID0gVFJVRX0KZGYzbSA8LSBlc3RhdF9nZXRNZXRhSW5mbyhhcHBJZCwgc3RhdHNEYXRhSWQgPSAiMDAwMzAwOTE4OSIpCmdsaW1wc2UoZGYzbSkKYGBgCgpgYGB7cn0KZGYzbSRjYXQwMgpgYGAKCiMjIyBQb3B1bGF0aW9uIGluIEVuZ2xpc2gKCmBgYHtyIGNhY2hlID0gVFJVRX0KZGYzZSA8LSBlc3RhdF9nZXRTdGF0c0RhdGEoYXBwSWQsIHN0YXRzRGF0YUlkID0gIjAwMDM0NDUwNzgiLCBsYW5nID0gIkUiKQpkZjNlCmBgYAoKIyMjIERhdGEgU2VhcmNoCgpgYGB7cn0KZXN0YXRfZ2V0U3RhdHNMaXN0KGFwcElkID0gYXBwSWQsIGxhbmcgPSAiRSIsCiAgICAgICAgICAgICAgICAgICBzZWFyY2hXb3JkID0gIlBvcHVsYXRpb24iLCAKICAgICAgICAgICAgICAgICAgIC51c2VfbGFiZWwgPSBGQUxTRSkKYGBgCgpgYGB7cn0KZXN0YXRfZ2V0U3RhdHNMaXN0KGFwcElkID0gYXBwSWQsIGxhbmcgPSAiRSIsCiAgICAgICAgICAgICAgICAgICBzZWFyY2hXb3JkID0gIlVuZW1wbG95ZWQiLCAKICAgICAgICAgICAgICAgICAgIC51c2VfbGFiZWwgPSBGQUxTRSkKYGBgCgpgYGB7ciBjYWNoZSA9IFRSVUV9CmRmNGUgPC0gZXN0YXRfZ2V0U3RhdHNEYXRhKGFwcElkLCBzdGF0c0RhdGFJZCA9ICIwMDAzNDQ1MDk5IiwgbGFuZyA9ICJFIikKZGY0ZQpgYGAKCgpgYGB7ciBjYWNoZSA9IFRSVUV9CmVzdGF0X2dldFN0YXRzTGlzdChhcHBJZCA9IGFwcElkLCBsYW5nID0gIkoiLAogICAgICAgICAgICAgICAgICAgc2VhcmNoV29yZCA9ICLlhajlm73lrrboqIjmp4vpgKDoqr/mn7siLCAKICAgICAgICAgICAgICAgICAgIC51c2VfbGFiZWwgPSBGQUxTRSkKYGBgCgpgYGB7ciBjYWNoZSA9IFRSVUV9CmRmNSA8LSBlc3RhdF9nZXRTdGF0c0RhdGEoYXBwSWQsIHN0YXRzRGF0YUlkID0gIjAwMDM0NDMzODQiLCBsYW5nID0gIkoiKQpkZjUKYGBgCgpgYGB7ciBjYWNoZSA9IFRSVUV9CmRmNW0gPC0gZXN0YXRfZ2V0TWV0YUluZm8oYXBwSWQsIHN0YXRzRGF0YUlkID0gIjAwMDM0NDMzODQiKQpnbGltcHNlKGRmNW0pCmBgYAoKIyMgVXNpbmcgVVJMCgpBUEkgVVJMIOOBruani+mAoOOCkueQhuino+OBmeOCi+OAggoKUuOBi+OCiWUtU3RhdCBBUEnjgpLkvb/jgYY6IGh0dHBzOi8vcWlpdGEuY29tL25vem1hL2l0ZW1zL2Y4OGY1Y2M2MGFiNjM0NjFkZWFlCgpgYGB7cn0KbGlicmFyeShodHRyKQojIOOCouODl+ODquOCseODvOOCt+ODp+ODsyBJRCDjgpLmjIflrprjgZfjgb7jgZnjgIIKYXBwaWQgPC0gYXBwSWQgIyAi44GC44Gq44Gf44Gu44Ki44OX44Oq44Kx44O844K344On44OzIElEIgoKIyDntbHoqIjooaggSUQg44KS5oyH5a6a44GX44G+44GZ44CCCnN0YXRzRGF0YUlkIDwtICIwMDAzNDQ1MDc4IgoKIyDjg4fjg7zjgr/jgpLlj5blvpfjgZfjgb7jgZnjgIIKcmVzcG9uc2UgPC0gR0VUKHVybCA9ICJodHRwOi8vYXBpLmUtc3RhdC5nby5qcC9yZXN0LzMuMC9hcHAvZ2V0U2ltcGxlU3RhdHNEYXRhIiwKICAgICAgICAgICAgICAgICBxdWVyeSA9IGxpc3QoYXBwSWQgPSBhcHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHNEYXRhSWQgPSBzdGF0c0RhdGFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YUdldEZsZyA9ICJZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250R2V0RmxnID0gIk4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBsYW5hdGlvbkdldEZsZyA9ICJZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkdldEZsZyA9ICJZIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbkhlYWRlckZsZyA9ICIxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVNwQ2hhcnMgPSAiMCIpKQpnbGltcHNlKHJlc3BvbnNlKQpgYGAKCgoKIyBgZXN0YXRhcGlgCgoqIFIgUGFja2FnZSBgZXRhdGFwaWAgaG9tZTogIGh0dHBzOi8vQ1JBTi5SLXByb2plY3Qub3JnL3BhY2thZ2U9ZXN0YXRhcGkKKiBNYW51YWw6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9lc3RhdGFwaS9lc3RhdGFwaS5wZGYKKiBSRUFETUU6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9lc3RhdGFwaS9yZWFkbWUvUkVBRE1FLmh0bWwKKiBHaXRIdWJQYWdlczogaHR0cHM6Ly95dXRhbm5paGlsYXRpb24uZ2l0aHViLmlvL2VzdGF0YXBpLwogIC0gR2l0SHViOiBodHRwczovL2dpdGh1Yi5jb20veXV0YW5uaWhpbGF0aW9uL2VzdGF0YXBpLwogIAojIyDln7rmnKzkuovpoIUKCltHaXRIdWJQYWdlc10oaHR0cHM6Ly95dXRhbm5paGlsYXRpb24uZ2l0aHViLmlvL2VzdGF0YXBpLykg44Gu5YaF5a6544KS44G+44Ga44Gv44CB56K66KqN44GX44G+44GZ44CCCgojIyMg57Wx6KiI6KGo5oOF5aCx5Y+W5b6X77yIYGVzdGF0X2dldFN0YXRzTGlzdCgpYO+8iQoKYGBgCmFwcElkIDwtICIgIiAjIOengeOBruOCguOBruOBr+OAgeiLseaVsApgYGAKCgpgYGB7ciBpbmNsdWRlPUZBTFNFfQphcHBJZCA8LSByZWFkX2xpbmVzKCIuLy4uLy4uLy4uL19kYXRhL2tleS9lc3RhdGtleS50eHQiKQpgYGAKYGBge3J9CmVzdGF0X2dldFN0YXRzTGlzdChhcHBJZCA9IGFwcElkLCBzZWFyY2hXb3JkID0gIuODgeODp+OCs+ODrOODvOODiCIpCmBgYAoK44GT44GT44Gn44CBU1RBVF9OQU1F44KER09WX09SR+OBr+S6uumWk+OBjOiqreOBv+OChOOBmeOBhOW9ouW8j+OBruODqeODmeODq+OBq+OBquOBo+OBpuOBhOOBvuOBmeOBjOOAgSDjg5fjg63jgrDjg6njg6DkuK3jgafmibHjgYbloLTlkIjjga/jgrPjg7zjg4njga7jgb7jgb7jga7mlrnjgYzpg73lkIjjgYzjgYTjgYTjgZPjgajjgoLjgYLjgorjgb7jgZnjgILjgZ3jga7jgajjgY3jga8udXNlX2xhYmVsID0gRkFMU0XjgpLmjIflrprjgZfjgabjgY/jgaDjgZXjgYTjgIIKCmBgYHtyfQplc3RhdF9nZXRTdGF0c0xpc3QoYXBwSWQgPSBhcHBJZCwgCiAgICAgICAgICAgICAgICAgICBzZWFyY2hXb3JkID0gIuODgeODp+OCs+ODrOODvOODiCIsIAogICAgICAgICAgICAgICAgICAgLnVzZV9sYWJlbCA9IEZBTFNFKQpgYGAKCiMjIyDjg6Hjgr/mg4XloLHlj5blvpfvvIhgZXN0YXRfZ2V0TWV0YUluZm8oKWDvvIkKCue1seioiOODh+ODvOOCv+OBruODoeOCv+aDheWgseOCkuWPluW+l+OBl+OBvuOBmeOAguOBk+OBrumWouaVsOOBr+OAgee1kOaenOOCkmxpc3TjgajjgZfjgabov5TjgZfjgb7jgZnjgIJsaXN044Gu5ZCE6KaB57Sg44GM44CB44Gd44KM44Ge44KM44Gu44OH44O844K/6aCF55uu44Gr44Gk44GE44Gm44Gu44Oh44K/5oOF5aCx44KS5ZCr44KT44GgdGJsX2Rm44Gr44Gq44Gj44Gm44GE44G+44GZ44CCCgrkvovjgYjjgbDjgIEwMDAzMTAzNTMy44Go44GE44GGSUTjga7ntbHoqIjjgavplqLjgZnjgovjg6Hjgr/mg4XloLHjgpLlj5blvpfjgZnjgovjgavjga/jgIFzdGF0c0RhdGFJZOOBqOOBhOOBhuW8leaVsOOBq0lE44KS5oyH5a6a44GX44Gm44CB5Lul5LiL44Gu44KI44GG44Gr44GX44G+44GZ44CCCgpgYGB7cn0KbWV0YV9pbmZvIDwtIGVzdGF0X2dldE1ldGFJbmZvKGFwcElkID0gYXBwSWQsIHN0YXRzRGF0YUlkID0gIjAwMDMxMDM1MzIiKQpuYW1lcyhtZXRhX2luZm8pCmBgYAoKYGBge3J9Cm1ldGFfaW5mbyRjYXQwMQpgYGAKCiMjIyDntbHoqIjjg4fjg7zjgr/lj5blvpfvvIhgZXN0YXRfZ2V0U3RhdHNEYXRhKClg77yJCgpgYGB7cn0KZXN0YXRfZ2V0U3RhdHNEYXRhKAogIGFwcElkID0gYXBwSWQsCiAgc3RhdHNEYXRhSWQgPSAiMDAwMzEwMzUzMiIsCiAgY2RDYXQwMSA9IGMoIjAxMDgwMDEzMCIsIjAxMDgwMDE0MCIpCikKYGBgCgpsaW1pdOOBp+WPluW+l+OBmeOCi+acgOWkp+OBruODrOOCs+ODvOODieaVsOOCkuOAgXN0YXJ0UG9zaXRpb27jgaflj5blvpfjgpLlp4vjgoHjgovjg6zjgrPjg7zjg4njga7kvY3nva7jgpLmjIflrprjgZnjgovjgZPjgajjgoLjgafjgY3jgb7jgZnjgILjgajjgorjgYLjgYjjgZrlsJHjgZfjgaDjgZHmipzjgY3lh7rjgZfjgabopovjgZ/jgYTloLTlkIjjgoTjgIHlsJHjgZfjgZrjgaTjg4fjg7zjgr/jgpLlj5bjgaPjgabjgY3jgZ/jgYTloLTlkIjjgavjga/jgZPjgozjgonjga7jg5Hjg6njg6Hjg7zjgr/jgYzkvr/liKnjgafjgZnjgIIKCmBgYHtyfQplc3RhdF9nZXRTdGF0c0RhdGEoCiAgYXBwSWQgPSBhcHBJZCwgc3RhdHNEYXRhSWQgPSAiMDAwMzEwMzUzMiIsIGNkQ2F0MDEgPSBjKCIwMTA4MDAxMzAiLCIwMTA4MDAxNDAiKSwKICBsaW1pdCA9IDMKKQpgYGAKCmBgYHtyfQplc3RhdF9nZXRTdGF0c0RhdGEoCiAgYXBwSWQgPSBhcHBJZCwgc3RhdHNEYXRhSWQgPSAiMDAwMzEwMzUzMiIsIGNkQ2F0MDEgPSBjKCIwMTA4MDAxMzAiLCIwMTA4MDAxNDAiKSwKICBzdGFydFBvc2l0aW9uID0gMTAxLAogIGxpbWl0ID0gMwopCmBgYAoKIyMjIOODh+ODvOOCv+OCq+OCv+ODreOCsOaDheWgseWPluW+l++8iGBlc3RhdF9nZXREYXRhQ2F0YWxvZygpYO+8iQoK57Wx6KiI6KGo44OV44Kh44Kk44Or77yIRXhjZWzjgIFDU1bjgIFQREbvvInjgYrjgojjgbPntbHoqIjjg4fjg7zjgr/jg5njg7zjgrnjga7mg4XloLHjgpLlj5blvpfjgafjgY3jgb7jgZnjgIIKCuOBk+OBrkFQSeOBr+ODleOCoeOCpOODq+OBrlVSTOOCkui/lOOBmeOBoOOBkeOBquOBruOBp+OAgeOBneOBruOBvuOBvlLjgaflh6bnkIbjgZnjgovjgZPjgajjga/pm6PjgZfjgYTjgYvjgoLjgZfjgozjgb7jgZvjgpPjgIIKCgpgYGB7ciBldmFsPUZBTFNFfQpjYXRhbG9nMSA8LSBlc3RhdF9nZXREYXRhQ2F0YWxvZyhhcHBJZCA9IGFwcElkLCBzZWFyY2hXb3JkID0gIuODgeODp+OCs+ODrOODvOODiCIsIGRhdGFUeXBlID0gYygiUERGIiwgIlhMUyIpKQpgYGAKCgpgYGB7ciBldmFsPUZBTFNFfQpjYXRhbG9nMVsxLCBjKCJAaWQiLCAiU1RBVF9OQU1FIiwgIlRBQkxFX05BTUUiLCAiU1VSVkVZX0RBVEUiLCAiVEFCTEVfU1VCX0NBVEVHT1JZMSIsICJEQVRBU0VUX05BTUUiLCAiTkFNRSIsICJMQU5ESU5HX1BBR0UiLCAiVVJMIiwgIkZPUk1BVCIpXSAlPiUKICBnbGltcHNlCmBgYAoKIyMgZXN0YXRhcGnjg5Hjg4PjgrHjg7zjgrjjgafnsKHljZjjgatlLVN0YXTjga7jg4fjg7zjgr/lj5blvpcKCjIwMTYuNS4yNyDmm7TmlrDjga7oqJjkuovvvJpodHRwczovL3FpaXRhLmNvbS9rYXp1dGFuL2l0ZW1zLzljMGIyZGQwZjA1NWZkZTQ1Y2RhCgpgYGB7cn0Kc29jaWFsX2xpZmVfc3RhdCA8LSBlc3RhdF9nZXRTdGF0c0xpc3QoYXBwSWQgPSBhcHBJZCwgc2VhcmNoV29yZCA9ICLnpL7kvJrnlJ/mtLvln7rmnKzoqr/mn7siKQpgYGAKCmBgYHtyfQpnbGltcHNlKHNvY2lhbF9saWZlX3N0YXQpCmBgYAoKYGBge3J9CnN0YXRzX2xpc3RfZWcxIDwtIGVzdGF0X2dldFN0YXRzTGlzdChhcHBJZCA9IGFwcElkLCBzZWFyY2hXb3JkID0gIiIsIHN0YXRzQ29kZSA9ICIwMDQ1MDAxMiIpCmBgYAoKYGBge3J9CmdsaW1wc2Uoc3RhdHNfbGlzdF9lZzEpCmBgYAoKYGBge3J9Cm1ldGFfaW5mbyA8LSBlc3RhdF9nZXRNZXRhSW5mbyhhcHBJZCA9IGFwcElkLCBzdGF0c0RhdGFJZCA9ICIwMDAzMDY2ODQ0IikKbmFtZXMobWV0YV9pbmZvKQpgYGAKCmBgYHtyfQpkZjEgPC0gZXN0YXRfZ2V0U3RhdHNEYXRhKAogIGFwcElkID0gYXBwSWQsCiAgc3RhdHNEYXRhSWQgPSAiMDAwMzA2Njg0NCIsCiAgY2RDYXQwMSA9ICIwMDIiLAogIGNkQXJlYSA9ICIwMDAwMCIpCmBgYAoKYGBge3J9CmdsaW1wc2UoZGYxKQpgYGAKCmBgYHtyfQprbml0cjo6a2FibGUoaGVhZChkZjEsOSkpCmBgYAoKIyMjIFLjgYvjgollc3RhdGFwaeODkeODg+OCseODvOOCuOOCkumAmuOBl+OBpmUtc3RhdCBBUEnjgpLjgaTjgYvjgYYKClVwZGF0ZTogMjAyMC4xMi42IGh0dHBzOi8vcm9ucmktcnVrZWljaGkuaGF0ZW5hYmxvZy5jb20vZW50cnkvMjAyMC8xMi8wNi8yMzA0NDUKCmBgYHtyfQpyZXMxIDwtIGVzdGF0X2dldFN0YXRzTGlzdChhcHBJZCA9IGFwcElkLCBzZWFyY2hXb3JkID0gIueUo+alrSBBTkQg5bm06b2iIiwgc3VydmV5WWVhcnMgPSAiMTk5MDAxLTE5OTUxMiIsc3RhdHNDb2RlPSAiMDAyMDAiICxsaW1pdD0xMDAsIHN0YXRzRmllbGQgPSAiMDMiKQpgYGAKCmBgYHtyfQpnbGltcHNlKHJlczEpCmBgYAoKIyMjIyBtZXRhIGRhdGEKCmBgYHtyfQptZXRhMSA8LSAgZXN0YXRfZ2V0TWV0YUluZm8oYXBwSWQsIjAwMDAxNDA0NDAiICkKYGBgCgpgYGB7cn0KZ2xpbXBzZShtZXRhMSkKYGBgCgpgYGB7cn0KZHRhMV9mIDwtIGVzdGF0X2dldFN0YXRzRGF0YShhcHBJZCAsIjAwMDAxNDA0NDAiICxjZENhdDAyID0gYygiMDAyIikpCmBgYAoKYGBge3J9CmdsaW1wc2UoZHRhMV9mKQpgYGAKCmBgYHtyIGV2YWw9RkFMU0V9CmNhdGFsb2cxIDwtIGVzdGF0X2dldERhdGFDYXRhbG9nKGFwcElkLCBzZWFyY2hXb3JkID0gIuODgeODp+OCs+ODrOODvOODiCIsIGRhdGFUeXBlID0gYygiQ1NWIikpCmBgYAoKCiMjIyBS44GL44KJZS1TdGF044OH44O844K/5Y+W5b6XCgpgYGB7cn0KZXN0YXRfZ2V0U3RhdHNMaXN0KGFwcElkID0gYXBwSWQsIAogICAgICAgICAgICAgICAgICAgc2VhcmNoV29yZCA9ICIiLAogICAgICAgICAgICAgICAgICAgc3RhdHNDb2RlID0gIjAwMjAwNTIxIikKYGBgCgrmlL/lupzntbHoqIjjgrPjg7zjg4nooajvvJpodHRwczovL3d3dy5lLXN0YXQuZ28uanAvc3RhdC1zZWFyY2gvZGF0YWJhc2U/cGFnZT0xCgojIyMgZXN0YXRhcGkg44KS55So44GE44Gf5YWs55qE57Wx6KiI44Gu5Yip5rS755SoCn7mmLzlpJzplpPkurrlj6Pjgavln7rjgaTjgpnjgY/nmbropovlnLDoh6rmrrrmrbvkuqHnjofjga7mjIfmqJnkvZzmiJB+IOS5heS/neeUsCDosrTmloco5aSa5pGp5aSn5a2mKQoKaHR0cHM6Ly93d3cuanN0YWdlLmpzdC5nby5qcC9hcnRpY2xlL2pzY3N0YWlrYWkvMzMvMC8zM185My9fcGRmLy1jaGFyL2phCgojIyMg44Gd44Gu54Sh6Iy25oyv44KK77yM77yIUuOBp++8iUdJU+OBjOino+axuuOBl+OBvuOBme+8muODleODreODvOODh+ODvOOCv+WIhuaekOe3qO+8iGUtU3RhdOS9v+OBhOWAkuOBl+OBruW3u++8iQoKS2Vpc3VrZSBUYWthbm86IGh0dHBzOi8vcnB1YnMuY29tL2tfdGFrYW5vL3JfZGVfZ2VvbndfYXBwCgojIyMjIOecjOWklumAsuWtpuiAheODh+ODvOOCvwoK5a2m5qCh5Z+65pys6Kq/5p+744Gu57Wx6KiI6KGo44Gu5LiA6Kan44KS5Y+W5b6XCmVzdGF0YXBp44GuZXN0YXRfZ2V0U3RhdHNMaXN06Zai5pWw44KS55So44GE44Gm77yM5a2m5qCh5Z+65pys6Kq/5p+744Gr6Kmy5b2T44GZ44KL57Wx6KiI6KGo44Gu5LiA6Kan44KS5Y+W5b6X44GX44G+44GZ77yO57Wx6KiI6KGo44Gu5qSc57Si5pa55rOV44Gv44GE44GP44Gk44GL44GC44KK44G+44GZ44GM77yM5LuK5Zue44Gv77yM5pS/5bqc57Wx6KiI44Kz44O844OJ44KS55So44GE44Gf5qSc57Si44KS6KGM44GE44G+44GZ77yO5pS/5bqc57Wx6KiI44Kz44O844OJ44Gu5LiA6Kan44Gv44GT44Gh44KJ44Gu44Oa44O844K444Gr44GC44KK44G+44GZ77yO5a2m5qCh5Z+65pys57Wx6KiI6Kq/5p+744Gu44Kz44O844OJ44Gv44CMMDA0MDAwMDHjgI3jgajmm7jjgYTjgabjgYLjgorjgb7jgZnjga7jgafvvIzlvJXmlbBzdGF0c0NvZGXjgavvvIzjgZPjgaHjgonjgpLmjIflrprjgZfjgb7jgZnvvI7lvJXmlbBhcHBJZOOBq+OBr+WFiOeoi+WFpeWKm+OBl+OBn2FwcElk44KS77yMc2VhcmNoV29yZOOBr+ODluODqeODs+OCr+OCkuaMh+WumuOBl+OBpuOBj+OBoOOBleOBhO+8jgoKYGBge3J9CnRibF9pbmZvX3NjaG9vbCA8LSBlc3RhdGFwaTo6ZXN0YXRfZ2V0U3RhdHNMaXN0KGFwcElkPWFwcElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0c0NvZGU9IjAwNDAwMDAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoV29yZD0iIikKYGBgCgoKYGBge3J9CnRibF9pbmZvX3NjaG9vbApgYGAKCgpgYGB7cn0KZ2xpbXBzZSh0YmxfaW5mb19zY2hvb2wpCmBgYAoK5LuK5Zue44Gv5L6L44Go44GX44Gm77yMMjAxMOW5tOOBruecjOWklumAsuWtpuODh+ODvOOCv+OCkuWPluW+l+OBl+OBvuOBme+8jumgheebrlNUQVRJU1RJQ1NfTkFNReOBq+OAjOW5s+aIkO+8ku+8kuW5tOOAjeOAjOWkp+WtpuODu+Wkp+WtpumZouOAje+8jFRJVExF44Gr44CM5Ye66Lqr6auY5qCh44Gu5omA5Zyo5Zyw55yM5Yil44CA5YWl5a2m6ICF5pWw44CN44KS5ZCr44KA44OH44O844K/44GM44Gd44Gu5YCZ6KOc44Gr44Gq44KK44G+44GZ44Gu44Gn77yM57Wx6KiI6KGo5oOF5aCx44GL44KJ44Gd44Gh44KJ44KS5oq95Ye644GX44G+44GZ77yOCgpgYGB7cn0KdGJsX2luZm9fc2Nob29sX21pZ18yMDEwIDwtIHRibF9pbmZvX3NjaG9vbCAlPiUKICBkcGx5cjo6ZmlsdGVyKGdyZXBsKCLlubPmiJDvvJLvvJLlubQiLFNUQVRJU1RJQ1NfTkFNRSkmCiAgICAgICAgICAgICAgICAgIGdyZXBsKCLlpKflrabjg7vlpKflrabpmaIiLFNUQVRJU1RJQ1NfTkFNRSkmCiAgICAgICAgICAgICAgICAgIGdyZXBsKCLlh7rouqvpq5jmoKHjga7miYDlnKjlnLDnnIzliKXjgIDlhaXlrabogIXmlbAiLFRJVExFKSkKdGJsX2luZm9fc2Nob29sX21pZ18yMDEwCmBgYAoKYGBge3J9Cm1pZ18yMDEwIDwtIGVzdGF0YXBpOjplc3RhdF9nZXRTdGF0c0RhdGEoYXBwSWQ9YXBwSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHNEYXRhSWQ9dGJsX2luZm9fc2Nob29sX21pZ18yMDEwJGBAaWRgKQpoZWFkKG1pZ18yMDEwKQpgYGAKCuOAjFhYXzHjgI3jgajjgarjgaPjgabjgYTjgovmlrnjgYzlpKflrabjga7miYDlnKjlnLDjgavplqLjgZnjgovlpInmlbDvvIzjgIxYWF8y44CN44Gv5Ye66Lqr6auY5qCh44Gu5omA5Zyo5Zyw44Gr6Zai44GZ44KL5aSJ5pWw44Gn44GZ77yO5Y2z44Gh77yM44CMWFhfMeOAjeOBr+edgOWcsOWBtO+8jOOAjFhYXzLjgI3jga/nmbrlnLDlgbTjga7kvY3nva7mg4XloLHjgafjgZnvvI7lpInmlbB2YWx1ZeOBjO+8jOmDvemBk+W6nOecjOODmuOCoumWk+OBruecjOWklumAsuWtpuaVsOOBp+OBme+8juWkieaVsOOAjOioree9ruiAheWIpTnjgI3jgavjga/vvIzlpKflrabjga7oqK3nva7ogIXlj4rjgbPmgKfliKXjgpLljLrliKXjgZnjgovlpInmlbDjgafjgZnvvI7pg73pgZPlupznnIzjgrPjg7zjg4njgavlr77lv5zjgZnjgovlpInmlbDjga/vvIzlpKflrabjga7miYDlnKjlnLDjgavjgaTjgYTjgabjga7jgb/miormj6HjgafjgY3jgb7jgZnvvI4K44CA5Ye66Lqr6auY5qCh44Gu5omA5Zyo5Zyw44Gu5aSJ5pWw44CM6YO96YGT5bqc55yM5YilMuOAjeOBq+OBpOOBhOOBpu+8jOOBneOBruWApOOCkueiuuiqjeOBmeOCi+OBqO+8jOOAjOmDvemBk+W6nOecjOOAjeOBjOaKnOOBkeOBpuOBhOOCi+OBk+OBqOOBjOOCj+OBi+OCiuOBvuOBme+8jgrjgIAKYGBge3J9CnVuaXF1ZShtaWdfMjAxMCTpg73pgZPlupznnIzliKUyKQpgYGAK44GT44Gu44G+44G+44Gn44Gv5YiG5p6Q5LiK5omx44GE44Gr44GP44GE44Gu44Gn77yM5aSJ5pWw44CM6YO96YGT5bqc55yM5YilMuOAjeOBq+OAjOmDvemBk+W6nOecjOOAjeOCkuijnOOBo+OBn+OCguOBruOCku+8jOaWsOOBn+OBquWkieaVsG9yaWdpbl9uYW1l44Go44GX44Gm6L+95Yqg44GX44G+44GZ77yOCgpgYGB7cn0KbWlnXzIwMTBfbG9uZyA8LSBtaWdfMjAxMCAlPiUKICBkcGx5cjo6bXV0YXRlKG9yaWdpbl9uYW1lPWNhc2Vfd2hlbigKICAgICPjgIzkuqzpg73jgI3jgIzlpKfpmKrjgI3jgarjgonjgIzlupzjgI3jgpLoo5zjgYYKICAgIOmDvemBk+W6nOecjOWIpTIlaW4lYygi5Lqs6YO9Iiwi5aSn6ZiqIikgfiBwYXN0ZTAo6YO96YGT5bqc55yM5YilMiwi5bqcIiksCiAgICAj44CM5p2x5Lqs44CN44Gq44KJ44CM6YO944CN44KS6KOc44GGCiAgICDpg73pgZPlupznnIzliKUyPT0i5p2x5LqsIiB+ICLmnbHkuqzpg70iLAogICAgI+OAjOWMl+a1t+mBk+OAjeOAjOOBneOBruS7luOAjeOAjOioiOOAjeOBquOCieS9leOCguijnOOCj+OBquOBhAogICAg6YO96YGT5bqc55yM5YilMiVpbiVjKCLljJfmtbfpgZMiLCLjgZ3jga7ku5YiLCLoqIgiKSB+IOmDvemBk+W6nOecjOWIpTIsCiAgICAj5LiK44Gr6Kmy5b2T44GX44Gq44GR44KM44Gw44CM55yM44CN44KS6KOc44GGCiAgICBUUlVFIH4gcGFzdGUwKOmDvemBk+W6nOecjOWIpTIsIuecjCIpCiAgICApKQpgYGAKCuedgOWcsOWBtOOBruWkieaVsOOAjOmDvemBk+W6nOecjDHjgI3jga/nibnjgavkvZXjgYvjgpLoo5zjgYblv4XopoHjgoLjgarjgZXjgZ3jgYbjgarjga7jgafvvIzlpInmlbDlkI3jgpJkZXN0aW5hdGlvbl9uYW1l44Gr5aSJ5pu044GX77yM44Gd44Gu44G+44G+44Gr44GX44Gm44GK44GN44G+44GZ77yO44G+44Gf77yM5aSJ5pWw44CM6Kit572u6ICF5YilOeOAjeOCkuOAjGZvdW5kZXLjgI3jgavlpInjgYjjgZ/kuIrjgafvvIznmbrnnYDlnLDlkI3jgYzjgIzjgZ3jga7ku5bjgI3jgIzoqIjjgI3jgIzlhajlm73jgI3jgavoqbLlvZPjgZfjgarjgYTjg6zjgrPjg7zjg4njga7jgb/mrovjgZfjgb7jgZnvvI4KCmBgYHtyfQptaWdfMjAxMF9sb25nIDwtIG1pZ18yMDEwX2xvbmcgJT4lCiAgI+edgOWcsOWBtOOBruWkieaVsOOBruWQjeWJjeOCkuWkieabtAogIGRwbHlyOjpyZW5hbWUoZGVzdGluYXRpb25fbmFtZT3pg73pgZPlupznnIzliKUxKSAlPiUKICAj6Kit572u6ICF44KS56S644GZ5aSJ5pWw44Gu5ZCN5YmN44KS5aSJ5pu0CiAgZHBseXI6OnJlbmFtZShmb3VuZGVyPeioree9ruiAheWIpTkpICU+JQogICPlv4XopoHjgarlpInmlbDjga7jgb/mrovjgZkKICBkcGx5cjo6c2VsZWN0KGZvdW5kZXIsb3JpZ2luX25hbWUsZGVzdGluYXRpb25fbmFtZSx2YWx1ZSkgJT4lCiAgI+eZuuedgOWcsOWQjeOBjOOAjOOBneOBruS7luOAjeOAjOioiOOAjeOAjOWFqOWbveOAjeOBq+ipsuW9k+OBl+OBquOBhOODrOOCs+ODvOODieOBruOBv+aui+OBmQogIGRwbHlyOjpmaWx0ZXIoIShvcmlnaW5fbmFtZSVpbiVjKCLjgZ3jga7ku5YiLCLoqIgiLCLlhajlm70iKXwKICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9uYW1lJWluJWMoIuOBneOBruS7liIsIuioiCIsIuWFqOWbvSIpKSkKaGVhZChtaWdfMjAxMF9sb25nKQpgYGAKCuWFg+ODh+ODvOOCv+OBi+OCie+8jOmDvemBk+W6nOecjOWQjeOBqOmDvemBk+W6nOecjOOCs+ODvOODieOBruWvvuW/nOihqOOCkuS9nOOCiuOBvuOBme+8jumDvemBk+W6nOecjOWQjeOBr+WkieaVsOOAjOmDvemBk+W6nOecjOWIpTHjgI3jgpLjgZ3jga7jgb7jgb7nlKjjgYTjgovjgZPjgajjgYzjgafjgY3jgb7jgZnjgYzvvIzpg73pgZPlupznnIzjgrPjg7zjg4njga/lpInmlbBhcmVhX2NvZGXjga7lhYjpoK0y5paH5a2X44KS5Y+W44KK5Ye644GZ5b+F6KaB44GM44GC44KK44G+44GZ77yO44Gd44KM44KJ5aSJ5pWw44KS5L2c5oiQ44GX44Gf5LiK44Gn77yM6YO96YGT5bqc55yM5ZCN44O76YO96YGT5bqc55yM44Kz44O844OJ44GuMuWkieaVsOOBq+OBpOOBhOOBpuODh+ODvOOCv+OCkuODpuODi+ODvOOCr+OBq+OBl+OBvuOBme+8jgoKYGBge3J9CnByZWZfY29kZSA8LSBtaWdfMjAxMCAlPiUKICAj5b+F6KaB44Gq5aSJ5pWw44Gu44G/5q6L44GZCiAgZHBseXI6OnNlbGVjdCjpg73pgZPlupznnIzliKUxLGFyZWFfY29kZSkgJT4lCiAgI+mDvemBk+W6nOecjOWQjXByZWZfbmFtZeOBruWApOOBr++8jOmDvemBk+W6nOecjOWIpTHjga7lgKTjgZ3jga7jgb7jgb4KICBkcGx5cjo6bXV0YXRlKHByZWZfbmFtZT3pg73pgZPlupznnIzliKUxLAogICAgICAgICAgICAgICAgI+mDvemBk+W6nOecjOOCs+ODvOODiXByZWZfY29kZeOBruWApOOBr2FyZWFfY29kZeOBruWFiOmgrTLmloflrZcKICAgICAgICAgICAgICAgIHByZWZfY29kZT1zdWJzdHIoeD1hcmVhX2NvZGUsc3RhcnQ9MSxzdG9wPTIpKSAlPiUKICAj6YO96YGT5bqc55yM5ZCN44O744Kz44O844OJ44Gn44Om44OL44O844Kv5YyWCiAgZHBseXI6OmRpc3RpbmN0KHByZWZfbmFtZSxwcmVmX2NvZGUpCmBgYAoK6YO96YGT5bqc55yM5ZCN44KS44Kt44O844Gr77yM55m65Zyw44O7552A5Zyw5YG044Gr6YO96YGT5bqc55yM44Kz44O844OJ44KS57WQ5ZCI44GX44G+44GZ77yOCgpgYGB7cn0KbWlnXzIwMTBfbG9uZyA8LSBtaWdfMjAxMF9sb25nICU+JQogICPnmbrlnLDlgbTjgavpg73pgZPlupznnIzjgrPjg7zjg4njgpLntZDlkIgKICBkcGx5cjo6bGVmdF9qb2luKHk9cHJlZl9jb2RlLGJ5PWMoIm9yaWdpbl9uYW1lIj0icHJlZl9uYW1lIikpICU+JQogICPpg73pgZPlupznnIzjgrPjg7zjg4njga7lpInmlbDlkI3jgpLlpInmm7QKICBkcGx5cjo6cmVuYW1lKG9yaWdpbj1wcmVmX2NvZGUpICU+JQogICPnnYDlnLDlgbTjgavpg73pgZPlupznnIzjgrPjg7zjg4njgpLntZDlkIgKICBkcGx5cjo6bGVmdF9qb2luKHk9cHJlZl9jb2RlLGJ5PWMoImRlc3RpbmF0aW9uX25hbWUiPSJwcmVmX25hbWUiKSkgJT4lCiAgI+mDvemBk+W6nOecjOOCs+ODvOODieOBruWkieaVsOWQjeOCkuWkieabtAogIGRwbHlyOjpyZW5hbWUoZGVzdGluYXRpb249cHJlZl9jb2RlKQpgYGAKCuacgOW+jOOBq++8jOePvueKtue4puOBq+S4puOCk+OBp+OBhOOCi+ioreeri+iAheODu+aAp+WIpeavjuOBruODh+ODvOOCv+OCku+8jOaoquS4puOBs+OBq+WkieW9ouOBl+OBvuOBme+8juWJjeiAheOBr2xvbmflnovvvIzlvozogIXjga93aWRl5Z6L44Go44KC5ZG844Gz44G+44GZ77yO5aSJ5pWwZm91bmRlcuOCkuWfuua6luOBq++8jOODh+ODvOOCv+OCkndpZGXlnovjgbjlpInmj5vjgZnjgovpmpvjga/vvIx0aWR5cuOBrnBpdm90X3dpZGVy6Zai5pWw44KS55So44GE44Gm5Lul5LiL44Gu44KI44GG44Gr5a6f6KGM44GX44G+44GZ77yOV2lkZeWei+OBq+WkieaPm+OBl+OBquOBhOWkieaVsOOCkuW8leaVsGlkX2NvbHPjgafvvIzmlrDjgZ/jgavkvZzjgonjgozjgovlpInmlbDjga7lkI3liY3jgavlpInmlbBmb3VuZGVy44Gu5YCk44KS55So44GE44KL44GT44Go44KS5byV5pWwbmFtZXNfZnJvbeOBp++8jHdpZGXlnovjgavlpInlvaLjgZXjgozjgovoprPmuKzlgKTjga/lpInmlbB2YWx1ZeOBi+OCieadpeOCi+OBk+OBqOOCkuW8leaVsHZhbHVlc19mcm9t44Gn5piO56S644GX44G+44GZ77yOCgpgYGB7cn0KbWlnXzIwMTBfd2lkZSA8LSBtaWdfMjAxMF9sb25nICU+JQogICNXaWRl5Z6L44Gr5aSJ5o+b44GX44Gq44GE5aSJ5pWw44Gu5oyH5a6aCiAgdGlkeXI6OnBpdm90X3dpZGVyKGlkX2NvbHM9YyhvcmlnaW5fbmFtZSxkZXN0aW5hdGlvbl9uYW1lLG9yaWdpbixkZXN0aW5hdGlvbiksCiAgICAgICAgICAgICAgICAgICAgICPmlrDjgZ/jgarlpInmlbDlkI3jga7lhYPjgavjgarjgovlgKTjgYzlhaXjgaPjgZ/lpInmlbAKICAgICAgICAgICAgICAgICAgICAgbmFtZXNfZnJvbT1mb3VuZGVyLAogICAgICAgICAgICAgICAgICAgICAjV2lkZeWei+OBq+WkieaPm+OBleOCjOOCi+ims+a4rOWApOOBjOWFpeOBo+OBn+WkieaVsAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbT12YWx1ZSkKaGVhZChtaWdfMjAxMF93aWRlKQpgYGAKCuWkieaVsOWQjeOBjOaXpeacrOiqnuOBruOBvuOBvuOBoOOBqOaJseOBhOOBpeOCieOBhOOBruOBp++8jOiLseiqnuOBp+WkieaVsOWQjeOCkuS7mOOBkeebtOOBl+OBvuOBme+8juOBvuOBn++8jOmAsuWtpuiAhee3j+aVsOOBi+OCieeUt+WtkOOBrumAsuWtpuiAheaVsOOCkuW3ruOBl+W8leOBhOOBn+OCguOBruOCku+8jOWls+WtkOOBrumAsuWtpuiAheaVsOOBqOOBl+OBpuWkieaVsOOBq+i/veWKoOOBl+OBvuOBme+8jgoKYGBge3J9Cm1pZ18yMDEwX3dpZGUgPC0gbWlnXzIwMTBfd2lkZSAlPiUKICAj5aSJ5pWw5ZCN44KS5LuY44GR55u044GZCiAgZHBseXI6OnJlbmFtZSh0b3RhbD3oqIgsCiAgICAgICAgICAgICAgICBuYXRpb25hbD3lm73nq4ssCiAgICAgICAgICAgICAgICBwcml2YXRlPeengeeriywKICAgICAgICAgICAgICAgIG1hbGU96KiI44Gu44GG44Gh55S3KSAlPiUKICAj5aWz5a2Q44Gu6YCy5a2m6ICF5pWw44KS6KiI566XCiAgZHBseXI6Om11dGF0ZShmZW1hbGU9dG90YWwtbWFsZSkKYGBgCgrkuIrjgafkvZzmiJDjgZfjgZ/jg4fjg7zjgr/jga/vvIznmbrnnYDlnLDjg5rjgqLjgavjgaTjgYTjgabjg5Xjg63jg7zph4/jgYznuKbjgavkuKbjgpPjgafjgYTjgovlvaLlvI/jgafjgZnvvI7kuIDmlrnvvIzjgojjgY/opovjgotPROihqOOBr++8jOihjOaWueWQkeOBq+eZuuWcsOWBtOOBruWcsOWQje+8jOWIl+aWueWQkeOBq+edgOWcsOWBtOOBruWcsOWQjeOBjOS4puOCk+OBoOato+aWueihjOWIl+OBruW9ouOBruOCguOBruOBoOOBqOaAneOBhOOBvuOBme+8juS7peS4i+OBp+OBr++8jOeZuuedgOWcsOODmuOCouOBruODh+ODvOOCv+OCkk9E6KGo44Gu5b2i5byP44Gr5aSJ5b2i44GZ44KL5pa55rOV44KS56S644GX44G+44GZ77yOCuOAgOS+i+OBqOOBl+OBpu+8jOmAsuWtpuiAhee3j+aVsOOBq+OBpOOBhOOBpk9E6KGo44KS5L2c5oiQ44GX44G+44GZ77yO6KGo44Gu6KGM5pa55ZCR44Gr44Gv55m65Zyw5YG06YO96YGT5bqc55yM5ZCN77yM5YiX5pa55ZCR44Gr44Gv552A5Zyw5YG06YO96YGT5bqc55yM5ZCN44GM5Lim44G25b2i44Gr44GX44G+44GZ77yO44GT44Gu5aSJ5b2i44Gr44GvIO+8jOS4iuOBqOWQjOanmHBpdm90X3dpZGVy6Zai5pWw44GM5L2/44GI44G+44GZ77yO5byV5pWwaWRfY29sc+OBq+OBr+ihjOaWueWQkeOBruODqeODmeODq+OBqOOBquOCi+eZuuWcsOWBtOmDvemBk+W6nOecjOWQjW9yaWdpbl9uYW1l77yM5byV5pWwbmFtZXNfZnJvbeOBq+OBr+WkieaVsOWQjeOBqOOBquOCi+edgOWcsOWBtOmDvemBk+W6nOecjOWQjWRlc3RpbmF0aW9uX25hbWXvvIzlvJXmlbB2YWx1ZXNfZnJvbeOBq+OBr+S4puOBueabv+OBiOOCieOCjOOCi+mAsuWtpuiAhee3j+aVsHRvdGFs44KS5oyH5a6a44GX44G+44GZ77yOCuOAgApgYGB7cn0KbWlnXzIwMTBfdG90YWxfb2QgPC0gbWlnXzIwMTBfd2lkZSAlPiUKICAj44OH44O844K/44KST0Tooajjga7lvaLlvI/jgavlpInlvaIKICB0aWR5cjo6cGl2b3Rfd2lkZXIoaWRfY29scz1jKG9yaWdpbl9uYW1lKSwKICAgICAgICAgICAgICAgICAgICAgbmFtZXNfZnJvbT1kZXN0aW5hdGlvbl9uYW1lLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbT10b3RhbCkKaGVhZChtaWdfMjAxMF90b3RhbF9vZCkKYGBgCgojIyMjIOWcsOWfn+WxnuaAp+ODh+ODvOOCvwoK56S+5Lya44O75Lq65Y+j57Wx6KiI5L2T57O744Gu57Wx6KiI6KGo44Gu5LiA6Kan44KS5Y+W5b6XCgrku4rlm57ph43lipvjg6Ljg4fjg6vjga7oqqzmmI7lpInmlbDjgajjgZfjgabnlKjjgYTjgovjg4fjg7zjgr/jga/vvIznpL7kvJrjg7vkurrlj6PntbHoqIjkvZPns7vvvIjntbHoqIjjgafjgb/jgovpg73pgZPlupznnIzjg7vluILljLrnlLrmnZHjga7jgZnjgYzjgZ/vvInjgYvjgonlj5blvpfjgZfjgb7jgZnvvI7npL7kvJrjg7vkurrlj6PntbHoqIjkvZPns7vjga/vvIzlkITlnLDln5/jga7mp5jjgIXjgarnpL7kvJrjg7vntYzmuIjlsZ7mgKfjga7jgYbjgaHln7rnpI7nmoTjgarjgoLjga7jgpLvvIzpg73pgZPlupznnIzjg7vluILljLrnlLrmnZHljZjkvY3jgafpm4boqIjjgZfjgZ/jg4fjg7zjgr/jgafvvIzljZLmpa3oq5bmlofnrYnjgafjga7liKnnlKjpoLvluqbjgYzpq5jjgYTjgoLjga7jga7jgbLjgajjgaTjgafjgZnvvI7npL7kvJrjg7vkurrlj6PntbHoqIjkvZPns7vjga/vvIznpL7kvJrjg7vntYzmuIjlpInmlbDjga7nlJ/jga7lgKTjgpLjgb7jgajjgoHjgZ/ln7rnpI7jg4fjg7zjgr/jgajvvIzjgZ3jgozjgonlpInmlbDjgpLntYTjgb/lkIjjgo/jgZvjgaboqIjnrpfjgZXjgozjgovlkITnqK7mjIfmqJnjgpLjgb7jgajjgoHjgZ/npL7kvJrnlJ/mtLvntbHoqIjmjIfmqJnjgavliIbpoZ7jgZXjgozjgb7jgZnvvI4K44CA44G+44Ga44Gv77yM56S+5Lya44O75Lq65Y+j57Wx6KiI5L2T57O744KS5pS/5bqc57Wx6KiI44Kz44O844OJ44Gu5LiA6Kan44GL44KJ5o6i44GX44G+44GZ77yO44Kz44O844OJ44Gv44CMMDAyMDA1MDLjgI3jgafjgZnjga7jgafvvIzlrabmoKHln7rmnKzoqr/mn7vjga7loLTlkIjjgajlkIzjgZjjgY/vvIxlc3RhdF9nZXRTdGF0c0xpc3TjgpLnlKjjgYTjgabntbHoqIjooajjga7jg6rjgrnjg4jjgpLlj5blvpfjgZfjgb7jgZnvvI4K44CACmBgYHtyfQoj56S+5Lya44O75Lq65Y+j57Wx6KiI5L2T57O744Gu57Wx6KiI6KGo44Gu5LiA6KanCnRibF9pbmZvX3NpIDwtIGVzdGF0YXBpOjplc3RhdF9nZXRTdGF0c0xpc3QoYXBwSWQ9YXBwSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHNDb2RlPSIwMDIwMDUwMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoV29yZD0iIikKaGVhZCh0YmxfaW5mb19zaSkKYGBgCgrntbHoqIjooajjga7jg6rjgrnjg4jjgpLvvIzpg73pgZPlupznnIzjg4fjg7zjgr/vvIjpoIXnm65DT0xMRUNUX0FSRUHjgYzjgIzpg73pgZPlupznnIzjgI3jgpLlkKvjgoDvvInjga7jgb/jgavntZ7jgorjgb7jgZkKCmBgYHtyfQp0YmxfaW5mb19zaV9wcmVmIDwtIHRibF9pbmZvX3NpICU+JQogICPpoIXnm65DT0xMRUNUX0FSRUHjgYzjgIzpg73pgZPlupznnIzjgI3jgpLlkKvjgoDjg6zjgrPjg7zjg4njgavntZ7jgosKICBkcGx5cjo6ZmlsdGVyKGdyZXBsKCLpg73pgZPlupznnIwiLENPTExFQ1RfQVJFQSkpCmhlYWQodGJsX2luZm9fc2lfcHJlZikKYGBgCgojIyMjIOWfuuekjuODh+ODvOOCv+ODu+ekvuS8mueUn+a0u+e1seioiOaMh+aomeOBi+OCieW/heimgeOBque1seioiOihqOOCkuODgOOCpuODs+ODreODvOODiQoK5LuK5Zue44Gu5YiG5p6Q44Gn44Gv77yM5Z+656SO44OH44O844K/44O756S+5Lya55Sf5rS757Wx6KiI5oyH5qiZ44Gu44Gd44KM44Ge44KM44GL44KJ77yM5Lul5LiL44Gu5aSJ5pWw44KS55So44GE44G+44GZ77yOCgrln7rnpI7jg4fjg7zjgr8KQzEyMTEwMe+8mjHkurrlvZPjgZ/jgornnIzmsJHmiYDlvpcK56S+5Lya55Sf5rS757Wx6KiI5oyH5qiZCiNFMDYxMDIwMu+8muWkp+WtpuWPjuWuueWKm+aMh+aVsAojRTA5NTA077ya5aSn5Y2S6ICF5Ymy5ZCICjHkurrlvZPjgZ/jgornnIzmsJHmiYDlvpfjgavjgaTjgYTjgabjga/vvIzpoIXnm65TVEFUSVNUSUNTX05BTUXjgavjgIzln7rnpI7jg4fjg7zjgr/jgI3vvIxUSVRMReOBq+OAjO+8o+OAjeOCkuWQq+OCgOe1seioiOihqOOBq+WQq+OBvuOCjOOBvuOBme+8juOBneOCjOS7peWkluOBruWkieaVsOOBr++8jOmgheebrlNUQVRJU1RJQ1NfTkFNReOBq+OAjOekvuS8mueUn+a0u+e1seioiOaMh+aomeOAje+8jFRJVExF44Gr44CM77yl44CN44KS5ZCr44KA57Wx6KiI6KGo44GM44Gd44Gu5YCZ6KOc44Gr44Gq44KK44G+44GZ44Gu44Gn77yM57Wx6KiI6KGo5oOF5aCx44GL44KJ44Gd44Gh44KJ44KS5oq95Ye644GX44G+44GZ77yOCgpgYGB7cn0KdGJsX2luZm9fc2lfcHJlZl92YXJzIDwtIHRibF9pbmZvX3NpX3ByZWYgJT4lCiAgI+mgheebrlNUQVRJU1RJQ1NfTkFNReOBq+OAjOWfuuekjuODh+ODvOOCv+OAje+8jFRJVExF44Gr44CM77yj44CN44KS5ZCr44KA77yM44KC44GX44GP44GvCiAgZHBseXI6OmZpbHRlcigoZ3JlcGwoIuWfuuekjuODh+ODvOOCvyIsU1RBVElTVElDU19OQU1FKSZncmVwbCgi77yjIixUSVRMRSkpfAogICAgICAgICAgICAgICAgICAj6aCF55uuU1RBVElTVElDU19OQU1F44Gr44CM56S+5Lya55Sf5rS757Wx6KiI5oyH5qiZ44CN77yMVElUTEXjgavjgIzvvKXjgI3jgpLlkKvjgoAKICAgICAgICAgICAgICAgICAgKGdyZXBsKCLnpL7kvJrnlJ/mtLvntbHoqIjmjIfmqJkiLFNUQVRJU1RJQ1NfTkFNRSkmZ3JlcGwoIu+8pSIsVElUTEUpKSkKYGBgCgrln7rnpI7jg4fjg7zjgr9D44Gu57Wx6KiI6KGoSUTjga/jgIwwMDAwMDEwMTAz44CN77yM56S+5Lya55Sf5rS757Wx6KiI5oyH5qiZReOBrue1seioiOihqElE44Gv44CMMDAwMDAxMDIwNeOAjeOBp+OBmeOBruOBp++8jOOBneOCjOOBnuOCjGVzdGF0X2dldFN0YXRzRGF0YemWouaVsOOBp+e1seioiOihqOOCkuWPluW+l+OBl+OBvuOBme+8jgoKYGBge3J9CiPln7rnpI7jg4fjg7zjgr9D44Gu57Wx6KiI6KGo44KS5Y+W5b6XCmtpc29fYyA8LSBlc3RhdGFwaTo6ZXN0YXRfZ2V0U3RhdHNEYXRhKGFwcElkPWFwcElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0c0RhdGFJZD0iMDAwMDAxMDEwMyIpCiPnpL7kvJrnlJ/mtLvntbHoqIjmjIfmqJlF44Gu57Wx6KiI6KGo44KS5Y+W5b6XCnNpaHlvX2UgPC0gZXN0YXRhcGk6OmVzdGF0X2dldFN0YXRzRGF0YShhcHBJZD1hcHBJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzRGF0YUlkPSIwMDAwMDEwMjA1IikKYGBgCgrlj5blvpfjgZXjgozjgZ/lkITntbHoqIjooajjgYvjgonvvIzlv4XopoHjgarjg6zjgrPjg7zjg4njga7jgb/jgpLmrovjgZfjgb7jgZnvvI7lhbfkvZPnmoTjgavjga/vvIzntbHoqIjjgrPjg7zjg4ljYXQwMV9jb2Rl44GM5LiK44Gn5oyZ44GS44Gf5aSJ5pWw44Kz44O844OJ44Gr5LiA6Ie044GX77yM44GL44Gk6Kq/5p+75bm044GM44CMMjAxMOW5tOW6puOAjeOBq+S4gOiHtOOBmeOCi+OCguOBruOBruOBv+OCkuaui+OBl+OBvuOBme+8juOBneOBruS4iuOBp++8jOOBneOCjOOCieOCkuihjOaWueWQkeOBq+e1kOWQiOOBl+OBvuOBme+8jgoKYGBge3J9Cmtpc29fY192YXJzIDwtIGtpc29fYyAlPiUKICAjMeS6uuW9k+OBn+OCiuecjOawkeaJgOW+lwogIGRwbHlyOjpmaWx0ZXIoY2F0MDFfY29kZT09IkMxMjExMDEiKSAlPiUKICAjMjAxMOW5tOW6puOBruims+a4rOWApAogIGRwbHlyOjpmaWx0ZXIo6Kq/5p+75bm0PT0iMjAxMOW5tOW6piIpICU+JQogICPkuI3opoHjgarlpInmlbDjgpLliYrpmaQKICBkcGx5cjo6c2VsZWN0KC1g77yj44CA57WM5riI5Z+655ukYCkKc2loeW9fZV92YXJzIDwtIHNpaHlvX2UgJT4lCiAgI+Wkp+WtpuWPjuWuueWKm+aMh+aVsAogIGRwbHlyOjpmaWx0ZXIoY2F0MDFfY29kZT09IiNFMDYxMDIwMiJ8CiAgICAgICAgICAgICAgICAgIGNhdDAxX2NvZGU9PSIjRTA5NTA0IikgJT4lCiAgIzIwMTDlubTluqbjga7oprPmuKzlgKQKICBkcGx5cjo6ZmlsdGVyKOiqv+afu+W5tD09IjIwMTDlubTluqYiKSAlPiUKICAj5LiN6KaB44Gq5aSJ5pWw44KS5YmK6ZmkCiAgZHBseXI6OnNlbGVjdCgtYO+8peOAgOaVmeiCsmApCiPjg4fjg7zjgr/jgpLooYzmlrnlkJHjgavntZDlkIgKdmFycyA8LSByYmluZChraXNvX2NfdmFycyxzaWh5b19lX3ZhcnMpCmBgYAoK44OH44O844K/44KS5aSJ5pWw5q+O44Grd2lkZeWei+OBq+WkieW9ouOBl+OBvuOBme+8juWJjeOCguOBo+OBpuW/heimgeOBquWkieaVsOOBruOBv+aui+OBl++8jOWkieaVsGFyZWFfY29kZeOBruWFiOmgrTLmloflrZfjgYvjgonpg73pgZPlupznnIzjgrPjg7zjg4njgpLmlrDjgZ/jgarlpInmlbDjgajjgZfjgabkvZzmiJDjgZfjgb7jgZnvvI7jgb7jgZ/vvIzlpInmlbDjgrPjg7zjg4ljYXQwMV9jb2Rl44Gr5Z+644Gl44GE44Gm77yM5aSJ5b2i5b6M44Gu5aSJ5pWw5ZCN44KS5LiO44GI44KL5aSJ5pWwdmFybmFt44KS5L2c5oiQ44GX44G+44GZ77yO44Gd44Gu5LiK44Gn77yM44OH44O844K/44KSbG9uZ+Wei+OBi+OCiXdpZGXlnovjgavlpInlvaLjgZfjgb7jgZnvvI4KCmBgYHtyfQp2YXJzIDwtIHZhcnMgJT4lCiAgI+mDvemBk+W6nOecjOOCs+ODvOODieWkieaVsOOCkui/veWKoAogIGRwbHlyOjptdXRhdGUocHJlZl9jb2RlPXN1YnN0cih4PWFyZWFfY29kZSxzdGFydD0xLHN0b3A9MikpICU+JQogICPlv4XopoHjgarlpInmlbDjga7jgb/mrovjgZkKICBkcGx5cjo6c2VsZWN0KGNhdDAxX2NvZGUscHJlZl9jb2RlLOWcsOWfnyx2YWx1ZSkgJT4lCiAgI+WkieaVsOWQjeOCkuWkieabtAogIGRwbHlyOjpyZW5hbWUocHJlZl9uYW1lPeWcsOWfnykgJT4lCiAgI+WkieaVsOOCs+ODvOODieOBq+W/nOOBmOOBn+WkieaVsOOCkuS9nOaIkAogIGRwbHlyOjptdXRhdGUodmFybmFtPWRwbHlyOjpjYXNlX3doZW4oCiAgICBjYXQwMV9jb2RlPT0iQzEyMTEwMSIgfiAiaW5jb21lIiwKICAgIGNhdDAxX2NvZGU9PSIjRTA2MTAyMDIiIH4gImFjb21fdW5pdiIsCiAgICBjYXQwMV9jb2RlPT0iI0UwOTUwNCIgfiAidW5pdl9yYXRlIgogICkpCnZhcnNfd2lkZSA8LSB2YXJzICU+JQogICPjg4fjg7zjgr/jgpJsb25n5Z6L44GL44KJd2lkZeWei+OBq+WkieW9ogogIHRpZHlyOjpwaXZvdF93aWRlcihpZF9jb2xzPWMocHJlZl9jb2RlLHByZWZfbmFtZSksCiAgICAgICAgICAgICAgICAgICAgIG5hbWVzX2Zyb209dmFybmFtLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXNfZnJvbT12YWx1ZSkKaGVhZCh2YXJzX3dpZGUpCmBgYAoK44OH44O844K/44KS57WQ5ZCI44GX77yM5pu444GN5Ye644GX44G+44GZ77yOCgojIyMjIOmDvemBk+W6nOecjOW6geODneOCpOODs+ODiAoK5Y+W5b6X5YWD77ya5Zu95Zyf5pWw5YCk5oOF5aCx44CA5Zu944O76YO96YGT5bqc55yM44Gu5qmf6Zai44OH44O844K/CgpgYGB7cn0KI1NoYXBlZmlsZeOCkuiqreOBv+i+vOOBvwpwcmVmX29mZmljZSA8LSBzZjo6cmVhZF9zZihkc249IlAyOC0xMy5zaHAiKSAlPiUKICAj5aSJ5pWwUDI4XzAwM+OBjOOAjDEyMDAx44CN77yI6YO96YGT5bqc55yM5bqB6IiO77yJ44Gu44Os44Kz44O844OJ44Gu44G/5q6L44GZCiAgZHBseXI6OmZpbHRlcihQMjhfMDAzPT0iMTIwMDEiKSAlPiUKICAj6YO96YGT5bqc55yM44Kz44O844OJ44Gu5aSJ5pWw44KS5L2c5oiQCiAgZHBseXI6Om11dGF0ZShwcmVmX2NvZGU9c3Vic3RyKFAyOF8wMDEsMSwyKSkgJT4lCiAgI+mDvemBk+W6nOecjOOCs+ODvOODieOBruWkieaVsOOBoOOBkeaui+OBmQogIGRwbHlyOjpzZWxlY3QocHJlZl9jb2RlKSAlPiUKICAj6YO96YGT5bqc55yM44Kz44O844OJ44Gn44K944O844OICiAgZHBseXI6OmFycmFuZ2UocHJlZl9jb2RlKSAlPiUKICAjV0dTODQvVVRNNTRO44Gr5oqV5b2x5aSJ5o+bCiAgc2Y6OnN0X3RyYW5zZm9ybShjcnM9c2Y6OnN0X2NycygzMjY1NCkpCiNHZW9KU09O5b2i5byP44Gn5pu444GN5Ye644GXCnNmOjp3cml0ZV9zZihvYmo9cHJlZl9vZmZpY2UsCiAgICAgICAgICAgICBkc249Ii4vZGF0YS9wcmVmX29mZmljZS5nZW9qc29uIiwKICAgICAgICAgICAgIGRlbGV0ZV9kc249VFJVRSkKYGBgCgrpg73pgZPlupznnIzjg53jg6rjgrTjg7MKCmh0dHBzOi8vcnB1YnMuY29tL2tfdGFrYW5vL3JfZGVfZ2VvbndfYXBwCgpgYGB7cn0KI+mDvemBk+W6nOecjOODneODquOCtOODs+OCkuiqreOBv+i+vOOBvwpwcmVmX3BvbHkgPC0gZ2VvanNvbmlvOjpnZW9qc29uX3NmKHg9ImpwX3ByZWYuYy50b3BvanNvbiIpICU+JQogICPkuI3mlbTlnLDnianjgpLoo5zmraMKICBzZjo6c3RfbWFrZV92YWxpZCgpICU+JQogICNXR1M4NC9VVE01NE7jgavmipXlvbHlpInmj5sKICBzZjo6c3RfdHJhbnNmb3JtKGNycz1zZjo6c3RfY3JzKDMyNjU0KSkKI0dlb0pTT07lvaLlvI/jgafmm7jjgY3lh7rjgZcKc2Y6OndyaXRlX3NmKG9iaj1wcmVmX3BvbHksCiAgICAgICAgICAgICBkc249Ii4vZGF0YS9wcmVmX3BvbHkuZ2VvanNvbiIsCiAgICAgICAgICAgICBkZWxldGVfZHNuPVRSVUUpCmBgYAoKIyMjIyDlm73lnJ/mlbDlgKTmg4XloLHjg4Djgqbjg7Pjg63jg7zjg4njgrXjgqTjg4gKCmh0dHBzOi8vbmxmdHAubWxpdC5nby5qcC9rc2ovaW5kZXguaHRtbAoKIyMjIyBPdGhlciBTaXRlcwoKKiBS44Gn6Kej5p6Q77ya5pS/5bqc57Wx6KiI44Gu57eP5ZCI56qT5Y+jKGUtU3RhdCnjg4fjg7zjgr/lj5blvpfjgavkvr/liKnjgafjgZnvvIHjgIxlc3RhdGFwaeOAjeODkeODg+OCseODvOOCuAogIC0gaHR0cHM6Ly93d3cua2FyYWRhLWdvb2QubmV0L2FuYWx5dGljc3Ivci00NTcvCgoqIOWcsOWbs++8mmh0dHBzOi8vcWlpdGEuY29tL1JpbmdhX2h5ai9pdGVtcy8wZmM4YTAwYmE0YjcyMTNjYjUxZQoKYGBge3J9CmxpYnJhcnkobWFwcykKbGlicmFyeShtYXBkYXRhKQpgYGAKCmBgYHtyfQptYXAoJ2phcGFuJykKYGBgCgpgYGB7cn0KbWFwKCdqYXBhbicpCm1hcC5heGVzKCkKYGBgCmBgYHtyfQptYXAoImphcGFuIiwgaW50ZXJpb3IgPSBGQUxTRSkKbWFwKCJqYXBhbiIsIGJvdW5kYXJ5ID0gRkFMU0UsIGx0eSA9IDIsIGFkZCA9IFRSVUUpCmBgYAoKCm1hcGRhdGE6IGV4dHJhIG1hcCBkYXRhIGZvciBhIGZldyByZWdpb25zCgoKYGBge3J9Cm1hcCgiY2hpbmEiLCBpbnRlcmlvciA9IEZBTFNFKQojbWFwKCJjaGluYSIsIGJvdW5kYXJ5ID0gRkFMU0UsIGx0eSA9IDIsIGFkZCA9IFRSVUUpCmBgYAoKIyMjIEV4YW1wbGVzCgpgYGB7ciBjYWNoZSA9IFRSVUV9CmVzdGF0X2dldFN0YXRzTGlzdChhcHBJZCA9IGFwcElkLCBzZWFyY2hXb3JkID0gIuWKtOWDjeWKmyIpCmBgYAoKCmBgYHtyIGNhY2hlID0gVFJVRX0KZXN0YXRfZ2V0U3RhdHNMaXN0KGFwcElkID0gYXBwSWQsIHNlYXJjaFdvcmQgPSAi5Yq05YON5YqbIiwgLnVzZV9sYWJlbCA9IEZBTFNFKQpgYGAKCmBgYHtyIGNhY2hlID0gVFJVRX0KZXN0YXRfZ2V0U3RhdHNEYXRhKGFwcElkPWFwcElkLCBzdGF0c0RhdGFJZD0iMDAwMzE3NzAwMCIpCmBgYAoKYGBge3IgY2FjaGUgPSBUUlVFfQplc3RhdF9nZXRNZXRhSW5mbyhhcHBJZCA9IGFwcElkLCBzdGF0c0RhdGFJZCA9ICIwMDAzMTc3MDAwIinjgIAlPiUgbmFtZXMoKQpgYGAKCgojIOWPguiAgyBSZWZlcmVuY2VzCgoqIGUtU3RhdCBBUEkg5qmf6IO977yaaHR0cHM6Ly93d3cuZS1zdGF0LmdvLmpwL2FwaS8KICAtIOOBk+OCjOOCkuOCguOBqOOBq+OAgWBlc3RhdGFwaWAg44Gv5L2c5oiQ44GV44KM44Gm44GE44KL44CCCiogQVBJIOaPkOS+m+ODh+ODvOOCv++8mmh0dHBzOi8vd3d3LmUtc3RhdC5nby5qcC9zdGF0LXNlYXJjaC9kYXRhYmFzZT9wYWdlPTEKICAtIOODquOCueODiOOBruacgOWIneOBq+OBguOCi+OCguOBruOBjOOAgTjmoYHjga7jgIzmlL/lupzntbHoqIjjgrPjg7zjg4njgI3jgafjgZnjgILjgZfjgYvjgZfjgIHjgZPjgozjga/jgIHjg4fjg7zjgr/jgrPjg7zjg4njgafjga/jgarjgYTjga7jgafjgIHjgZPjgZPjgYvjgonliIbpoZ7jga7mnKvnq6/jgavooYzjgaPjgabjgIFBUEkg44Go6KGo56S644GV44KM44Gf44Go44GT44KN44GL44KJ44CBYHN0YXRzRGF0YUlkYCDjgpLlvpfjgb7jgZnjgIIKICAKKiBS44GL44KJZS1TdGF0IEFQSeOCkuS9v+OBhjogaHR0cHM6Ly9xaWl0YS5jb20vbm96bWEvaXRlbXMvZjg4ZjVjYzYwYWI2MzQ2MWRlYWUKCg==